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

Receiving broadcasted packets when listening to a specific port

本文关键字:广播 数据包      更新时间:2023-09-26

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

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地址计算器";是一个工具,您可以使用它来确定特定网络的正确广播地址。