Delphi 如何使用Indy10 TIdUDPClient接收广播数据包?
我正在连接一个发送UDP数据包的系统,它既可以作为响应(发送到特定IP地址)也可以作为广播(根据WireShark,dest 255.255.255) 我可以正确地接收“直接”数据包,但我不知道如何获取广播数据包。我假设我需要第二个具有不同绑定的TIdUDPClient,但我一直无法让它工作Delphi 如何使用Indy10 TIdUDPClient接收广播数据包?,delphi,udp,c++builder,indy10,Delphi,Udp,C++builder,Indy10,我正在连接一个发送UDP数据包的系统,它既可以作为响应(发送到特定IP地址)也可以作为广播(根据WireShark,dest 255.255.255) 我可以正确地接收“直接”数据包,但我不知道如何获取广播数据包。我假设我需要第二个具有不同绑定的TIdUDPClient,但我一直无法让它工作 TIdUDPClient *reader(new TIdUDPClient(NULL)); TIdUDPClient *broadcastReader(new TIdUDPClient(NULL)); r
TIdUDPClient *reader(new TIdUDPClient(NULL));
TIdUDPClient *broadcastReader(new TIdUDPClient(NULL));
reader->Port = 2000;
reader->Host = "192.168.0.1";
reader->Connect();
broadcastReader->Port = 2000;
// broadcastReader->Host = "0.0.0.0"; // This doesn't work, but is here as an example
broadcastReader->BroadcastEnabled = true;
broadcastReader->Connect();
然后我有其他几乎相同的线程调用reader/broadcastReader->ReceiveBuffer()
。reader
one工作正常,但是broadcastReader->receiveBuffer()
永远不会返回
对C++代码和Delphi标签的歉意;-)p>
TIdUDPClient
不是为接收广播而设计的。改为使用TIdUDPServer
。如果目标是接收未经请求的数据包,您不需要服务器组件而不是客户端吗?@RobKennedy-看起来如此-但是,我只对接收来自某个特定主机IP的广播感兴趣。不过,使用UDP等无连接协议的客户端和服务器之间的区别似乎有点奇怪。谢谢。我正要得出那个结论。自Indy9以来,这似乎已经发生了变化,因为我确信我以前能够通过UDPClient接收广播。还有一点——对于服务器,我通常会从该端口上发送的所有主机接收广播——我可以自动将其限制在单个主机上吗,或者我应该检查每个数据包的发送方吗?这并不是说TIdUDPClient
根本无法接收广播。只是它不能像TIdUDPServer
那样自动接收TIdUDPServer
有一个OnUDPRead
事件,每当新数据到达时就会触发该事件。您必须手动调用TIdUDPClient.Receive…()
方法之一,例如在计时器或线程中,才能完成相同的任务。不过,在处理广播数据时,确实不应该使用Connect()
Connect()
在IP/端口对之间建立静态链接,因此它可能会在操作系统层过滤广播数据包。我已从两个(!)客户端切换到一个服务器,并让Indy管理侦听线程。它工作得很好,我的代码更简单。可能是connect()
这就是问题所在,但我对新的解决方案很满意。TIdUDPServer
本机不支持任何类型的过滤,因此您必须手动查看每个数据包上的发送方IP。在激活服务器之前,您可能可以设置每个TIdUDPServer.Bindings
条目的TIdSocketHandle.PeerIP
属性,然后使用TIdUDPServer.onaafterbind
事件调用TIdSocketHandle.Connect()
,但我不知道这是否真的起作用,我从来没有试过。