【问题标题】:UDP Broadcasting with Indy Sockets: how to select the right Interface?带有 Indy 套接字的 UDP 广播:如何选择正确的接口?
【发布时间】:2016-08-30 22:52:55
【问题描述】:

使用 C++Builder2006

我正在修改一个旧的小程序来做这些事情:

  1. 发送UDP广播消息(使用255.255.255.255地址)
  2. 从所有连接的设备(配备 RabbitCore RCM3200 的硬件)中获取答案
  3. 可选择广播另一条 UDP 消息,其中包含其中一个的 MAC 地址以及该设备必须为自己设置的正确网络配置。

(这会导致设备在安装时可能具有错误的 IP/网络掩码,并且需要一种独立于 IP 的方法来设置它。 这是设备制造商的成熟方法,因此无法更改,我只是在描述我在做什么)。

我面临的问题已经很好地描述了here:简而言之,Win7 不会通过所有接口发送 UDP 消息,而只能通过“首选”接口发送。 由于该程序是使用 Indy UDPClient 套接字 (TIdUDPClient) 构建的,因此我想保持原样。

问题:

  1. 有办法“强制”UDP 套接字通过特定的网络接口发送吗?这样我可以“手动”循环并将广播发送到所有(相关)网络
  2. 如果不是......我应该怎么做才能获得相同的结果?

【问题讨论】:

  • 也许我还没有说清楚,抱歉:“由于程序是使用 Indy UDPClient 套接字 (TIdUDPClient) 构建的,所以我想保持原样。”意味着我想找到一个仍然使用 Indy 组件的解决方案,而不是我想让应用程序只使用一个接口发送广播消息。

标签: sockets networking udp indy c++builder-2006


【解决方案1】:

有办法“强制”UDP 套接字通过特定的网络接口发送吗?

TIdUDPClient 有一个 BoundIP 属性用于该确切目的。每次要更改 BoundIP 时都必须调用 TIdUDPClient.Binding.CloseSocket(),除非为每个适配器绑定不同的 TIdUDPClient 对象。

这样我可以“手动”循环并将广播发送到所有(相关)网络

根据您使用的 Indy 版本,您可以使用 TIdStack.LocalAddresses 属性或 TIdStack.AddLocalAddressesToList()TIdStack.GetLocalAddressList() 方法来获取可用的本地 IP 地址列表,然后您可以循环访问。

【讨论】:

  • 谢谢。但是我找不到使用 TidStack 的方法。该类本身不是可实例化的,因为它是抽象的,我无法找到派生 TIdStackWindows 的定义...我已经尝试过(因为我已经找到了)GStack 变量,但我不知道它在哪里声明(显然不在 IdGlobal.hpp 中)
  • @FabioCalzolari 全局 GIdStack 对象指针在 IdStack.hpp 标头中声明。 Indy 10 中的 TIdUDPClient 中有一个 BoundIP 属性。您是否使用 Indy 9 代替?
  • 是的,Indy9 已包含在 BCB2006 中。
  • TIdUDPClient 不支持绑定到 Indy 9 中的特定接口。但您可以通过从 TIdUDPClient 派生并覆盖虚拟 GetBinding() 方法来添加它。
猜你喜欢
  • 2012-09-22
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多