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