ブロードキャスト UDP パケットを送信するサーバーと、同じマシン内の他の 2 つのクライアントでそれを受信するサーバーを用意したいと考えています。これはどうにかして実現できますか? どの IP アドレスを使用すればよいですか?
@gravyface は私に希望を与えてくれましたが、私は試してみました:
- サーバーは 127.255.255.255:54321 に送信し、クライアントは 0.0.0.0:54321 をリッスンしています。
- サーバーは 127.255.255.255:54321 に送信し、クライアントは 127.0.0.1:54321 をリッスンします。
- サーバーは 127.255.255.255:54321 に送信し、クライアントは 127.255.255.255:54321 をリッスンします。
どれも機能しませんでした!:(
OBS: REUSE_ADDR および SO_BROADCAST オプションを使用しています。
答え1
最初のウィンドウ:
socat -u udp-recv:12345,reuseaddr -
2番目のウィンドウ:
socat -u udp-recv:12345,reuseaddr -
3番目のウィンドウ
socat - udp-sendto:127.255.255.255:12345,broadcast
次に、3 番目のウィンドウに数行のテキストを入力して、他の 2 つのウィンドウに何か表示されるかどうかを確認します。
実際にどのようなシステム コールが実行されているかを確認するには、「socat」を「strace -fe network socat」に置き換えます (Linux を使用している場合、他の unice には tusc、struss、または dtruss と呼ばれる同等の機能があります)。socat はオープン ソースであり、ほとんどのオペレーティング システムでバイナリ パッケージが利用可能です。
socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) = 3
setsockopt(3, SOL_SOCKET, SO_BROADCAST, [1], 4) = 0
sendto(3, "qwe\n", 4, 0, {sa_family=AF_INET, sin_port=htons(12345), sin_addr=inet_addr("127.255.255.255")}, 16) = 4
上記では、受信側の「クライアント」は INADDR_ANY アドレスにバインドします。ループバック サブネット上のアドレスにバインドすると、パケットが受信されないことが分かりましたが、その理由はよく分かりません。
参照:
$ ip route show table local dev lo scope link
broadcast 127.0.0.0 proto kernel src 127.0.0.1
broadcast 127.255.255.255 proto kernel src 127.0.0.1
クライアントが 127.0.0.0 または 127.255.255.255 にバインドし、サーバーが同じアドレス (SO_BROADCAST を使用) に送信する場合も、同様に機能します。
答え2
ブロードキャストトラフィックを 127.255.255.255 に送信すべき動作しますが、当然テストしてください (Wireshark/tcpdump が役立ちます)。
当然、クライアントもループバック デバイスをリッスンする必要があります。