Newsgroups : Borland : borland.public.delphi.internet.winsock : 2006 Jan : 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.