我正在编写一个需要捕获和打印 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
?