【问题标题】:UDP Broadcast to All IPs not working in some networksUDP 广播到所有 IP 在某些网络中不起作用
【发布时间】:2013-08-20 19:08:28
【问题描述】:

关于这个问题还有很多其他的答案,但我相信这是具体的。

我正在使用 Delphi XE2 和 Indy 10.5.8 和 TIdUDPServer

在我的本地开发网络中,我将所有内容都放在同一个网络 ip 子范围内,并且都连接到同一个接入点 (LinkSys)

我有 Android 将 UDP 广播发送到 255.255.255.255 以请求在 Delphi 中编写的服务器 IP 地址,使用端口 44444 上的 TIdUDPServer 进行侦听。

请求顺利到达那里,我可以毫无问题地回复。完全按预期工作。

但是我注意到在某些网络中它不起作用!它总是基于接入点的简单网络,我不确定,但似乎问题发生在哪里,服务器 PC 在设备使用 wifi 时连接到 LAN 端口,都在同一个接入点中。

可能是接入点不通过 LAN 和 wifi 广播 UDP 数据包的情况吗?我知道这种广播是非常有限的,但是我没有找到任何信息告诉我在同一个接入点有这样的限制。

是否有测试方法或解决方法?

此解决方案需要足够强大,以应对众多接入点。

编辑:对于那些想要获取源代码以从网络中检索更多信息的人,包括下面答案中提到的广播 ip,请遵循这个解决方案,它就在那里。

http://www.code10.info/index.php?option=com_content&view=article&id=54:articleretrieve-network-adapter-information&catid=47:cat_coding_algorithms_network&Itemid=78

【问题讨论】:

    标签: delphi udp delphi-xe2 indy10


    【解决方案1】:

    255.255.255.255 不是发送 UDP 广播的最佳选择,除非另有配置,否则某些路由器/防火墙会阻止它。更好的选择是使用 NIC 的实际子网广播 IP。例如,如果 UDP 套接字绑定到本地 IP 192.168.0.1,子网掩码为 255.255.255.0,则该子网的广播 IP 为 192.168.0.255

    大多数平台都有特定于操作系统的 API 用于检索 NIC 的实际广播 IP,例如 POSIX 系统上的 getifaddrs(),或者至少用于检索 NIC 的子网掩码,例如 Windows 上的 GetAdaptersInfo()GetAdaptersAddresses(),所以您可以手动计算广播IP。

    检索本地广播 IP 可能会在未来版本中添加到 Indy。

    【讨论】:

    • 谢谢,我是新手,使用这个广播的原因之一是因为我的服务器软件运行在一台动态分配IP的PC上,应该这样简单客户。您的意思是根据服务器绑定IP,该子网的广播IP总是会改变?并且向该广播 IP 发送 UDP 消息就像向该子网中的所有 ip 发送一样?
    • 本地绑定的IP是否动态无关紧要。您仍然可以检索分配 IP 的 NIC 的当前子网信息并确定当前的广播 IP(如果需要,手动计算非常简单)。即使绑定的 IP 可能会动态更改,子网的 IP 范围和掩码也不会经常更改,因为它们是路由器子网配置的一部分,会影响该子网上的所有客户端。是的,向广播 IP 发送数据包会将数据包发送到子网内的所有 IP(因此它是 广播 IP)。
    • 太棒了!,我已经测试并且工作得非常好,你介意在delphi中指出一个解决方案来进行计算吗?我已将我的 android 应用程序更改为发送到 192.168.0.255(对于我的测试用例),并且我的服务器收到了 UDP 广播并可以回答。这将有很多你无法想象的帮助。
    • 让我用你的答案来回答我的问题:embarcadero.newsgroups.archived.at/… 如果你有任何其他链接到现成的解决方案,我很感激。谢谢
    • 这里是一个完整的 delphi 解决方案的链接,其中包含所需的所有网络信息:code10.info/…
    猜你喜欢
    • 2011-09-16
    • 1970-01-01
    • 2018-03-25
    • 2012-11-09
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    相关资源
    最近更新 更多