Newsgroups : Borland : borland.public.delphi.internet.winsock : 2007 Mar : Re: TWebBrowser

www.cryer.info
Managed Newsgroup Archive

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.

Replies:

none

In response to:

www.cryer.info
Managed Newsgroup Archive