2013-08-20 39 views
0

还有很多与此问题有关的其他答案,但我相信这是特定的。UDP广播到在某些网络中不工作的所有IP

我使用德尔福XE2和印10.5.8和TIdUDPServer

在我的地方发展网络我有相同的网络IP子范围的一切,所有连接到同样的接入点(LinkSys的)

我有Android的sendind UDP广播到255.255.255.255请求服务器ip地址,这是写在德尔福使用端口44444 TIdUDPServer侦听。

请求得到那里罚款,我可以回答没有问题。完全按照预期工作。

但是我注意到,在某些网络中它不起作用!它总是基于接入点的简单网络,我不确定,但似乎发生问题的地方是服务器PC连接到局域网端口,而设备使用的是WiFi,全部在同一接入点。

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

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

这个解决方案需要足够强大来处理那里的许多AP。

编辑:对于那些想要从网络中检索更多信息的源代码(包括广播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

回答

5

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

大多数平台都用于获取网卡的实际广播IP操作系统特定的API,如getifaddrs()在POSIX系统,或至少检索网卡的子网掩码,如GetAdaptersInfo()GetAdaptersAddresses()在Windows上,这样你就可以算出广播IP手动。

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

+0

谢谢,我对这些东西是新的,使用这种广播的原因之一是因为我的服务器软件运行在具有IP动态分配的PC上,并且应该像这样对客户简单。你的意思是根据服务器绑定IP,广播IP总是要为那个子网改变?发送UDP消息到这个广播IP就像发送给该子网中的所有ips一样? –

+1

本地绑定的IP是否动态无关紧要。您仍然可以检索IP分配给NIC的当前子网信息,并确定当前的广播IP(如果需要,手动计算非常简单)。即使绑定的IP可能动态改变,子网的IP范围和掩码也不会经常更改,因为它们是路由器子网配置的一部分,会影响该子网上的所有客户端。是的,向广播IP发送数据包会将数据包传送给子网内的所有IP(因此它为什么是*广播* IP)。 –

+0

太棒了!我已经测试过并且工作得非常好,你是否介意在delphi中指定一个解决方案来进行计算?我已经改变了我的android应用程序发送到192.168.0.255(为我的测试用例),我的服务器收到UDP广播,并可以回答。这将帮助你无法想象。 –