waz*_*123 1 delphi indy10 delphi-xe3
如何正确发送数据包到UDP服务器?我正在尝试,但它没有工作,我没有从服务器收到任何东西.
我需要的是发送一个数据包: int64|int|int
并从服务器接收数据包: int|int|int64
怎么做正确?谢谢.
type
Tconnecting = record
a: int64;
b: integer;
c: integer;
end;
Treply_connect = record
a: integer;
b: integer;
c: int64;
end;
var
udp: TIdUDPClient;
send_data: TIdBytes;
received_data: TIdBytes;
i: integer;
packet: Tconnecting;
reply_packet: Treply_connect;
begin
packet.a := 41727101980;
packet.b := 0;
packet.c := RandomRange(1, 9999999);
SetLength(send_data, sizeof(packet));
Move(packet, send_data[0], sizeof(packet));
udp := TIdUDPClient.Create(nil);
try
udp.Host := 'server.com';
udp.Port := 1234;
udp.SendBuffer(send_data);
SetLength(received_data, 0);
i := udp.ReceiveBuffer(received_data, 5000);
Memo1.Lines.Add('Data reiceived! Len:'+IntToStr(Length(received_data))+',data:|'+BytesToString(received_data, 0)+'|');
finally
FreeAndNil(udp);
end;
Run Code Online (Sandbox Code Playgroud)
你没有ReceiveBuffer()正确使用.您将输出缓冲区的大小设置为0字节,因此ReceiveBuffer()将没有任何内存来读取接收到的数据.您需要将输出缓冲区预分配到您期望的最大大小.返回值ReceiveBuffer()将告诉您实际读入缓冲区的字节数.
换句话说,改变这个:
SetLength(received_data, 0);
Run Code Online (Sandbox Code Playgroud)
对此:
SetLength(received_data, SizeOf(Treply_connect));
Run Code Online (Sandbox Code Playgroud)
并改变这个:
Memo1.Lines.Add('Data reiceived! Len:'+IntToStr(Length(received_data))+', data:|'+BytesToString(received_data, 0)+'|');
Run Code Online (Sandbox Code Playgroud)
对此:
Memo1.Lines.Add('Data received! Len:'+IntToStr(i)+', data:|'+BytesToString(received_data, 0, i)+'|');
Run Code Online (Sandbox Code Playgroud)
另外,Indy有一个RawToBytes()功能可以用来将你的数据包复制到TIdBytes:
send_data := RawToBytes(packet, SizeOf(packet));
Run Code Online (Sandbox Code Playgroud)
还有一个BytesToRaw()函数,用于何时提取收到的数据包:
BytesToRaw(received_data, reply_packet, SizeOf(reply_packet));
Run Code Online (Sandbox Code Playgroud)