在收听特定端口时接收广播的数据包

当通过dgram.createSocket('udp4');设置套接字时dgram.createSocket('udp4'); 而不绑定到一个特定的端口,我收到广播的数据包发送到255.255.255.255但是,当我绑定到我的接口的特定IP相同的套接字this.server.bind(67, host); 我不会收到这些广播的数据包。 这是一个正常的行为?

java.net.DatagramSocket的Javadoc说:

为了接收广播包,DatagramSocket应该绑定到通配符地址。 在一些实现中,当DatagramSocket被绑定到更具体的地址时,也可以接收广播分组。

这是一个非常清楚的迹象表明,行为是平台依赖的,所以Javascript套接字将会受到同样的折磨。

根据我的testing,Windows Vista 64的行为不像第二句中所述(即,除非绑定到INADDR_ANY,否则不会接收广播)。

是的,这是预期的行为,因为没有端口或接口,dgram.createSocket()会:

绑定到随机端口上的“所有接口”地址(它对udp4和udp6套接字都是正确的)。

– 来自nodejs.org上的dgram API文档

它允许您捕获广播数据包到任何可用接口上的任何端口。

同时将接口和端口同时用于createSocket(),只会限制您捕获已经广播到绑定到指定端口上指定接口的networking的数据包。

您应该注意,要接收广播到特定的接口,他们将需要被发送到该接口所服务的networking的广播地址。

所以如果你的networking是:

 10.1.1.0 

networking掩码为:

 255.255.255.252 

这也是:

 10.1.1.0/29 (CIDR notation) 

正确的广播地址是:

 10.1.1.7 

鉴于您的networking地址和networking掩码,tuxgraphics.org的“ networking和IP地址计算器 ”是一个工具,您可以使用它来识别您的特定networking的正确的广播地址。