Newsgroups : Borland : borland.public.delphi.internet.winsock : 2006 Jan : Indy to pure winsock

www.cryer.info
Managed Newsgroup Archive

Indy to pure winsock

Subject:Indy to pure winsock
Posted by:"James" (jj..@aol.com)
Date:Thu, 19 Jan 2006 14:46:35

I am trying to convert some Indy code into pure winsock (first time I've
used winsock)

Here's my Indy code

procedure GetServerData;
   var
     Buf,
     RecvBuf     : TIdBytes;
     read,
     I       : integer;
     Temp      : string;
     TempArr     : TExplodeArray;
   begin
     setlength(Buf, 30);
     // Instalize Buf
     Buf[0]  := 254; Buf[1]  := 253; Buf[2]  := 0;
     Buf[3]  := 224; Buf[4]  := 235; Buf[5]  := 45;
     Buf[6]  := 14;   Buf[7]  := 20;   Buf[8]  := 1;
     Buf[9]  := 11;   Buf[10] := 1;    Buf[11] := 5;
     Buf[12] := 8;    Buf[13] := 10;   Buf[14] := 51;
     Buf[15] := 52;  Buf[16] := 53;   Buf[17] := 19;
     Buf[18] := 4;    Buf[19] := 54;   Buf[20] := 55;
     Buf[21] := 56;  Buf[22] := 57;   Buf[23] := 20;
     Buf[24] := 58;  Buf[25] := 59;   Buf[26] := 60;
     Buf[27] := 61;  Buf[28] := 0;  Buf[29] := 0;

     Form1.UDP.Host := Host;
     Form1.UDP.Port := Port;
     Form1.UDP.Active := true;
     Form1.UDP.Connect;
     try
      Form1.UDP.Send(BytesToString(Buf));
      setlength(Buf, 0);
      if not ReadFromBinding(Form1.UDP.Binding, Buf, 5000) then
        Form1.StaticText11.Caption := 'Could not connect.'
      else
        Temp := '';
        I := 0;
        while I <= length(Buf) do
        begin
         Temp := Temp + char(Buf[I]);
         inc(I, 1);
        end;
     finally
      Form1.UDP.Disconnect;
      Form1.UDP.Active := false;
      TempArr := Explode(char(0), Temp);
      if length(TempArr) <> 0 then
      begin
        ParseServerInfo(TempArr);
      end;
      Application.ProcessMessages;
     end;
   end;
And what I have with winsock so far...

procedure TForm1.Button1Click(Sender: tobject);
var
  InitData  : TWSADATA;
  Skt    : TSocket;
  SktAddr   : TSockAddr;
  Buffer : array of byte;
  Res,
  I,
  Size     : integer;
  Temp     : string;
  TempTS : TStrings;
begin
  setlength(Buffer, 29);
  // Instalise buffer
  Buffer[0] := 254;   Buffer[1] := 253;   Buffer[2] := 0;
  Buffer[3] := 224;   Buffer[4] := 235;   Buffer[5] := 45;
  Buffer[6] := 14;   Buffer[7] := 20;  Buffer[8] := 1;
  Buffer[9] := 11;   Buffer[10] := 1;  Buffer[11] := 5;
  Buffer[12] := 8;   Buffer[13] := 10;   Buffer[14] := 51;
  Buffer[15] := 52;   Buffer[16] := 53;  Buffer[17] := 19;
  Buffer[18] := 4;   Buffer[19] := 54;   Buffer[20] := 55;
  Buffer[21] := 56;   Buffer[22] := 57;   Buffer[23] := 20;
  Buffer[24] := 58;   Buffer[25] := 59;   Buffer[26] := 60;
  Buffer[27] := 61;   Buffer[28] := 0; Buffer[29] := 0;
  // Load Winsock
  try
   if WSAStartup($202, InitData) <> 0 then
   begin
     messagedlg('Winsock could not be loaded.', mtError, [mbOK], 0);
     exit;
   end;
   // Create new socket
   Skt := Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
   if Skt = INVALID_SOCKET then
   begin
     messagedlg('Socket could not be created.', mtError, [mbOK], 0);
     exit;
   end;
   // Instalise socket data
   SktAddr.sin_family := AF_INET;
   SktAddr.sin_port := htons(5121);
   SktAddr.sin_addr := in_addr(inet_addr(pchar('86.143.146.61')));
   // Send Packets
   Temp := '';
   for I := 0 to 29 do
   begin
     Temp := char(Buffer[I]);
   end;
   Res := SendTo(Skt, Temp, sizeof(Temp), 0, SktAddr, sizeof(SktAddr));
   if Res = SOCKET_ERROR then
   begin
     messagedlg('Connection to server could not be made.', mtError, [mbOK],
0);
     exit;
   end;
   setlength(Buffer, 0);
   setlength(Buffer, 1023);
   Size := sizeof(SktAddr);
   Res := RecvFrom(Skt, Buffer, sizeof(Buffer), 0, SktAddr, Size);
   if Res = SOCKET_ERROR then
   begin
     messagedlg('Error recieving data.', mtError, [mbOK], 0);
     exit;
   end;
   I := 0;
   while I < length(Buffer) - 1 do
   begin
     if (Buffer[I] > 30) and (Buffer[I] < 100) then
      Temp := Temp + char(Buffer[I]);
     inc(I);
   end;
   Memo1.Clear;
   Memo1.text := Temp;
  finally
   CloseSocket(Skt);
   WSACleanup;
  end;
end;
Now the Indy code works fine and I recieve a response from the server
however the Winsock version gets stuck in a loop with the RecvFrom()
function and does not timeout at all. Also the Winsock version does not
recieve a response from the server. Is this due to a difference in the send
packets?

Could someone point me in the right direction with the Winsock conversion?

Thanks.

Replies:

www.cryer.info
Managed Newsgroup Archive