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
?