単一のマシンでブロードキャスト パケットをテストできますか?

単一のマシンでブロードキャスト パケットをテストできますか?

ブロードキャスト UDP パケットを送信するサーバーと、同じマシン内の他の 2 つのクライアントでそれを受信するサーバーを用意したいと考えています。これはどうにかして実現できますか? どの IP アドレスを使用すればよいですか?


@gravyface は私に希望を与えてくれましたが、私は試してみました:

  1. サーバーは 127.255.255.255:54321 に送信し、クライアントは 0.0.0.0:54321 をリッスンしています。
  2. サーバーは 127.255.255.255:54321 に送信し、クライアントは 127.0.0.1:54321 をリッスンします。
  3. サーバーは 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 が役立ちます)。

当然、クライアントもループバック デバイスをリッスンする必要があります。

関連情報