检测绑定位置以接收 UDP 广播

检测绑定位置以接收 UDP 广播

我正在编写一个需要捕获和打印 UDP 广播的应用程序。使用的网络接口是:

enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.1  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::a00:27ff:feb9:b18c  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:b9:b1:8c  txqueuelen 1000  (Ethernet)

以下状态的数据包已成功接收并打印。

$ sudo lsof -P -iUDP
python3   5496            root    3u  IPv4  54675      0t0  UDP *:67

$ sudo strace python3 main.py 2>&1 | grep bind
bind(3, {sa_family=AF_INET, sin_port=htons(67), sin_addr=inet_addr("0.0.0.0")}, 16) = 0

我需要绑定到特定地址而不是所有地址0.0.0.0。因此,我更改脚本以模拟0.0.0.0行为和循环并绑定到子网中任何可能的地址。结果是:

$ sudo lsof -P -iUDP
python3   5472            root    3u  IPv4  52392      0t0  UDP 192.168.10.0:67 
python3   5472            root    4u  IPv4  52393      0t0  UDP user-VirtualBox:67 
python3   5472            root    6u  IPv4  52647      0t0  UDP 192.168.10.255:67 

但是,该应用程序仍然不打印任何内容。

问题

0.0.0.0绑定到与绑定到每个可能的可绑定地址之间是否有区别,这可能导致包无法传递到用户空间应用程序?

答案1

DHCP 客户端发送请求,255.255.255.255.67因此侦听可以接收这些请求的对象对于 DHCP 服务器来说是有益的。在测试中,绑定到相当于你的192.168.10.255:bootps监听地址的东西才不是看到那些数据包。

是什么迫使我们需要绑定到不存在的东西上*:67

相关内容