Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何使用Indy10 TIdUDPClient接收广播数据包?_Delphi_Udp_C++builder_Indy10 - Fatal编程技术网

Delphi 如何使用Indy10 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

我正在连接一个发送UDP数据包的系统,它既可以作为响应(发送到特定IP地址)也可以作为广播(根据WireShark,dest 255.255.255)

我可以正确地接收“直接”数据包,但我不知道如何获取广播数据包。我假设我需要第二个具有不同绑定的TIdUDPClient,但我一直无法让它工作

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()
,但我不知道这是否真的起作用,我从来没有试过。