通过dgram.createSocket('udp4');
设置套接字并且不将其绑定到特定端口时,我确实接收到发送到255.255.255.255的广播数据包
但是当我将相同的套接字绑定到我的接口this.server.bind(67, host);
的特定IP时,我将不会收到这些广播的数据包。这是正常行为吗?
答案 0 :(得分:4)
Javadoc for java.net.DatagramSocket说:
为了接收广播数据包,应绑定DatagramSocket 到通配符地址。在一些实现中,广播分组 当DatagramSocket绑定到更具体的时候也可以接收 地址。
这是一个非常清楚的迹象,表明行为是依赖于平台的,所以Javascript套接字会以同样的方式受到影响。
根据我的测试,Windows Vista 64的行为与第二句中的描述不同(即除非绑定到INADDR_ANY,否则不接收广播)。
答案 1 :(得分:2)
是的,这是预期的行为,因为没有端口或接口,dgram.createSocket()会:
绑定到随机端口上的“所有接口”地址(对于udp4和udp6套接字,它都是正确的。)
- 来自nodejs.org上的dgram API documentation
允许您将广播数据包捕获到任何可用接口上的任何端口。
证明接口和端口到createSocket()限制您只捕获已经广播到绑定到指定端口上指定接口的网络的数据包。
您应该注意,要接收特定接口的广播,需要将它们发送到该接口所服务的网络上的广播地址。
因此,如果您的网络是:
10.1.1.0
使用网络掩码:
255.255.255.252
也是:
10.1.1.0/29 (CIDR notation)
正确的广播地址是:
10.1.1.7
根据您的网络地址和网络掩码,tuxgraphics.org的“Network and IP address calculator”是一个工具,可用于识别特定网络的正确广播地址。