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

おすすめ記事