我正在尝试在Delphi中使用TUdpSocket.我想要做的是连接到UDP服务器,发送一些数据并等待答案.数据发送正确,但控件没有收到任何内容.我不知道为什么.我已经在这个问题上苦苦挣扎了好几个小时了,我要放弃了:-(.
我试过使用TIdUDPClient,但情况是一样的.数据发送正确,但没有收到.
只有TIdUDPServer能够或多或少正常工作才能发送和接收数据.不幸的是,数据接收由一个单独的线程(主要或其他,取决于ThreadedEvent属性)处理,这迫使我使用同步并使整个代码复杂化.我想在我自己的线程中处理UDP连接.只需发送一些数据并调用WaitForData()等待答案,然后在同一个线程中处理它.
如果不可能,我不想使用任何第三方控件,但如果它是唯一的解决方案,我接受它.
非常非常感谢您的帮助.
– – 例子 – –
i)TUDPSocket:
var
lR, lW, lE: boolean;
begin
UdpSocket1.LocalPort := '1600';
UdpSocket1.RemotePort := '1600';
UdpSocket1.RemoteHost := '127.0.0.1';
UdpSocket1.Connect;
UdpSocket1.Sendln('test');
UdpSocket1.Select(@lR, @lW, @lE, 2000);
if lR then
ShowMessage(UdpSocket1.Receiveln());
end;
如您所见,控件应该接收它传输的数据.显然它确实如此,因为在调用Select()方法之后,lR的计算结果为true.但是Receiveln()返回一个空字符串,就像ReceiveBuf()那样.当我启动UDP服务器并向其发送一些数据时,它被正确接收,因此我确信数据确实已发送.
最佳答案 你应该只需要这个:
function SayHi(Host: String; Port: Integer): String;
var
Client: TIdUDPClient;
begin
Client := TIdUDPClient.Create(nil);
try
Client.Host := Host;
Client.Port := Port;
Client.Send('Hello');
Result := Client.ReceiveString(1000);
finally
Client.Free;
end;
end;
这将在同一个线程中发送UDP数据包,并在超时后接收UDP数据包或引发异常.
如果上述方法不起作用,请检查(使用Wireshark这样的客户端实际发送数据的内容.然后检查服务器上是否实际收到了数据包.
Send()最终(在Windows上)调用WinSock的sendto(),而ReceiveString()使用select()和recvfrom().您可以通过排序模拟TIdUDPServer
while not Terminated do begin
S := Client.ReceiveString(1000);
DoSomething(S);
end;