【问题标题】:How to receive broadcast packets with Indy10 TIdUDPClient?如何使用 Indy10 TIdUDPClient 接收广播数据包?
【发布时间】:2012-11-06 20:43:15
【问题描述】:

我正在连接到一个发送 UDP 数据包的系统,作为响应(发送到特定 IP 地址)和广播(根据 WireShark,dest 为 255.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 工作正常,但 broadcastReader->receiveBuffer() 永远不会返回......

为 C++ 代码和 Delphi 标签道歉 ;-)

【问题讨论】:

  • 如果目标是接收未经请求的数据包,您不需要服务器组件而不是客户端吗?
  • @RobKennedy - 看起来是这样 - 但是,我只对接收来自一个特定主机 IP 的广播感兴趣。不过,使用 UDP 等无连接协议的客户端和服务器之间的区别似乎有点奇怪。

标签: delphi udp c++builder indy10


【解决方案1】:

TIdUDPClient 不是为接收广播而设计的。请改用TIdUDPServer

【讨论】:

  • 谢谢。我正朝着那个结论前进。自 Indy9 以来,这似乎发生了变化,因为我确信我之前能够使用 UDPClient 接收广播。
  • 另外一点 - 使用服务器,我通常会收到来自在该端口上发送的所有主机的广播 - 我可以自动将其限制为单个主机,还是应该只检查每个数据包的发送者?
  • TIdUDPClient 根本收不到广播的问题。只是它不能像TIdUDPServer 那样自动接收。 TIdUDPServer 有一个 OnUDPRead 事件,只要有新数据到达,就会触发该事件。您必须手动调用TIdUDPClient.Receive...() 方法之一,例如在计时器或线程中,以完成相同的事情。不过,在处理广播数据时,您真的不应该使用Connect()Connect() 在 IP/端口对之间建立静态链接,因此它最终可能会在操作系统层过滤您的广播数据包。
  • 我已经从两个(!)客户端切换到一个服务器,并让 Indy 管理监听线程。它工作正常,我的代码更简单。 connect() 可能是问题所在,但我对新解决方案很满意。
  • TIdUDPServer 本身不支持任何类型的过滤,因此您必须在每个数据包上手动查看发件人 IP。您可以在激活服务器之前设置每个TIdUDPServer.Bindings 条目的TIdSocketHandle.PeerIP 属性,然后使用TIdUDPServer.OnAfterBind 事件在每个条目上调用TIdSocketHandle.Connect(),但我不知道这是否真的有效与否,我从未尝试过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-17
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
相关资源
最近更新 更多