Newsgroups : Borland : borland.public.delphi.internet.winsock : 2007 Mar : Re: TWebBrowser
| Subject: | Re: TWebBrowser |
| Posted by: | "Jeff Wormsley" (dawo..@cdc.net) |
| Date: | Mon, 16 Apr 2007 08:26:07 |
This is extracted from other code, has minimal error checking, and won't
compile on its own, but should give you some ideas...
uses
... Winsock, ... ;
function GetIPFromHost(const HostName: string): LongWord;
type
TaPInAddr = array[0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe: PHostEnt;
pptr: PaPInAddr;
i: Integer;
begin
Result := 0;
phe := GetHostByName(PChar(HostName));
if phe = nil then Exit;
pPtr := PaPInAddr(phe^.h_addr_list);
i := 0;
while pPtr^[i] <> nil do
begin
Result := LongWord(pptr^[i]^);
Inc(i);
end;
end;
Const
USER_AGENT = 'User-Agent: MyProgName/1.0 (Windows; Windows NT
5.1; en-US';
ACCCEPT_TYPES = 'Accept: text/xml,application/xml,text/html,text/plain';
ACCEPT_LANGUAGE = 'Accept-Language: en-us,en';
ACCEPT_CHARSET = 'Accept-Charset: ISO-8859-1';
KEEP_ALIVE = 'Keep-Alive: 300';
CONNECTION = 'Connection: keep-alive';
Var
wVersionRequested : Word;
wsa_Data : TWSAData;
TheSocket : TSocket;
TheAddress: TSockAddr;
SendLength : LongWord;
SendBuff : Array[0..2048] of Char; // Make sure it is big enough
for your request!
ReceiveLength : Integer;
ReceiveBuff : Array[0..8*65535] of Char; // Likewise, make sure it
is big enough!
rset: TFDSet;
TimeVal : TTimeVal;
I : Integer;
OutboundNetworkString: TStringList;
InboundNetworkString : String;
Begin
wVersionRequested := $0101;
WSAStartup(wVersionRequested, wsa_Data);
TheSocket := socket(AF_INET, SOCK_STREAM, 0);
TheAddress.sin_family := AF_INET;
TheAddress.sin_port := htons(80);
TheAddress.sin_addr.s_addr := GetIPFromHost(URLEdit.Text);
if (connect(TheSocket, TheAddress, SizeOf(TheAddress)) <>
SOCKET_ERROR) then
begin
OutboundNetworkString := TStringList.Create;
OutboundNetworkString.Add('GET /index.cgi? HTTP/1.1');
OutboundNetworkString.Add('Host: ' + URLEdit.Text);
OutboundNetworkString.Add(USER_AGENT);
OutboundNetworkString.Add(ACCCEPT_TYPES);
OutboundNetworkString.Add(ACCEPT_LANGUAGE);
OutboundNetworkString.Add(ACCEPT_CHARSET);
OutboundNetworkString.Add(KEEP_ALIVE);
OutboundNetworkString.Add(CONNECTION);
OutboundNetworkString.Add('Referer: http://' + URLEdit.Text +
'/index.cgi?action=login');
OutboundNetworkString.Add('Cookie: rand=; bpass=; user=' +
UserNameEdit.Text + '; pass=' + PassCookie);
OutboundNetworkString.Add('');
SendLength := Length(OutboundNetworkString.Text);
StrPCopy(SendBuff, OutboundNetworkString.Text);
OutboundNetworkString.Free;
send(TheSocket, SendBuff, SendLength, 0);
FD_ZERO(rset);
FD_SET(TheSocket, rset);
FillChar(TimeVal, sizeof(TimeVal), 0);
TimeVal.tv_sec := 30;
ReceiveLength := select(TheSocket + 1, @rset, nil, nil, @TimeVal);
if ReceiveLength > 0 then
Begin
FillChar(ReceiveBuff, SizeOf(ReceiveBuff), #00);
ReceiveLength := SOCKET_ERROR;
While ReceiveLength = SOCKET_ERROR Do
Begin
// Use buffer of length - 1 to guarantee a terminating null
ReceiveLength := recv(TheSocket, ReceiveBuff,
SizeOf(ReceiveBuff) - 1, 0 );
if (ReceiveLength = 0) OR (ReceiveLength = WSAECONNRESET) OR
(ReceiveLength = SOCKET_ERROR) then
Break
Else
Begin
I := 0;
while (ReceiveBuff[I] <> #00) and (I < ReceiveLength) do
Begin
InboundNetworkString := InboundNetworkString + ReceiveBuff[I];
Inc(I);
End;
ReceiveLength := SOCKET_ERROR;
End;
End;
End;
closesocket(TheSocket);
end;
WSACleanup;
end;
HTH,
Jeff.
none