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

Javascript 在侦听特定端口时接收广播数据包,javascript,node.js,networking,udp,broadcast,Javascript,Node.js,Networking,Udp,Broadcast,通过dgram.createSocket('udp4')设置套接字时并且未将其绑定到特定端口,我确实会接收发送到255.255.255.255的广播数据包 但是当我将同一个套接字绑定到接口的特定IPthis.server.bind(67,host)时我将不接收这些广播数据包。这是正常的行为吗 报告说: 为了接收广播数据包,应绑定DatagramSocket 到通配符地址。在一些实现中,广播数据包 当DatagramSocket绑定到更特定的 地址 这非常清楚地表明,这种行为依赖于平台,因此Jav

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

报告说:

为了接收广播数据包,应绑定DatagramSocket 到通配符地址。在一些实现中,广播数据包 当DatagramSocket绑定到更特定的 地址

这非常清楚地表明,这种行为依赖于平台,因此Javascript套接字也会受到同样的影响


根据我的测试,Windows Vista 64的行为与第二句中描述的不一样(即,除非绑定到INADR__ANY,否则不接收广播)。

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

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

--从nodejs.org上的

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

证明createSocket()的接口和端口将限制您仅捕获已广播到绑定到指定端口上指定接口的网络的数据包

您应该注意,要接收到特定接口的广播,需要将其发送到该接口所服务的网络上的广播地址

因此,如果您的网络是:

10.1.1.0 
网络掩码为:

255.255.255.252 
这也是:

10.1.1.0/29 (CIDR notation)
正确的广播地址是:

10.1.1.7

给定您的网络地址和网络掩码,tuxgraphics.org的“”是一个工具,您可以使用它来识别特定网络的正确广播地址。

@RobRaisch和一个merry-1。如果您正确地阅读了我的答案,您就会看到我引用Javadoc作为证据,证明这种行为依赖于平台,因此它也会影响Javascript,事实上,所有其他语言也会受到同样的影响。可惜你没有第一次得到它。这种行为实际上是依赖于平台的。例如,请参阅Stevens、Fenner和Rudolf,Unix网络编程,第一卷,第三版,第页。以及RFC 1192的#3.3.6,其在该问题上“不持任何立场”。