delphi – 处理TUdpSocket

我正在尝试在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;
点赞