我想在Delphi中使用TUdpSocket。我想要做的是连接到UDP服务器,发送一些数据并等待回答。数据正确发送,但控件不会收到任何内容。我不知道为什么。我一直在努力解决这个问题好几个小时,现在我要放弃了:-(。处理TUdpSocket
我试过使用TIdUDPClient,但情况是一样的。数据发送正常,但没有收到
只有TIdUDPServer或多或少地正常工作才能发送和接收数据。不幸的是,数据接收由一个单独的线程(主或其他,取决于ThreadedEvent属性)处理,这迫使我使用同步并使我想在自己的线程中处理UDP连接,只需发送一些数据并调用WaitForData()等待一个答案,然后在同一线程中处理它即可
并且if可能的,我不想使用任何第三方控件,但如果它是唯一的解决方案,我接受它。
非常感谢您提前给予您的帮助。
----实例---
ⅰ)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服务器并向它发送一些数据时,它会被正确接收,所以我确信数据是真正发送的。
模拟TIdUDPServer我曾与一个线程ICS类似的事情,所以不能直接回答。不过,你可能需要包括一个消息泵在你的线程中,以便套接字获得它需要工作的通知。 – mj2008 2010-10-14 10:06:14
你如何知道数据发送正确?服务器和客户端都在同一个子网上吗?你确定防火墙(本地或网内)不会阻止你的udp流量吗? – jachguate 2010-10-14 23:01:42
jachguate说了什么:使用类似Wireshark的东西来确保服务器机器实际接收数据包。如果有,并且您可以看到响应触及客户端的NIC,那么您可能会遇到未处理套接字通知的问题。 – 2010-10-15 12:32:58