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

Posted

技术标签:

【中文标题】监听特定端口时接收广播数据包【英文标题】:Receiving broadcasted packets when listening to a specific port 【发布时间】:2012-08-29 12:48:18 【问题描述】:

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

【问题讨论】:

【参考方案1】:

Javadoc for java.net.DatagramSocket 说:

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

这非常清楚地表明该行为取决于平台,因此 javascript 套接字将以同样的方式受到影响。

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

【讨论】:

@RobRaisch 也祝你快乐-1。如果您正确阅读了我的答案,您会看到我引用 Javadoc 作为行为依赖于平台的证据, 因此它也会影响 Javascript,实际上所有其他语言同样如此.很遗憾你第一次没有得到它。【参考方案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”是一个工具,您可以使用它来识别特定网络的正确广播地址。

【讨论】:

行为实际上是平台相关的。参见例如 Stevens, Fenner, & Rudolf, Unix Network Programming, Vol I, 3rd edition, p. 532 和 RFC 1192 的 #3.3.6 对这个问题“不采取立场”。

以上是关于监听特定端口时接收广播数据包的主要内容,如果未能解决你的问题,请参考以下文章

洪泛和广播的区别

udp为啥收不到广播中的数据,该怎么处理

如何忽略自己的广播 udp 数据包

基于VC/MFC 的UDP广播,我怎么接受返回的数据包

如何从任何 ip 和任何端口接收 UDP 数据包?

Python - 使用套接字设置源端口号