- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 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;
关于delphi - 处理TUdpSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3931484/
我是一名优秀的程序员,十分优秀!