web-dev-qa-db-ja.com

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

ブロードキャスト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オプションを使用しています。

3
chrisapotek

最初のウィンドウ:

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-fenetwork socat」に置き換えて、実際に行われているシステムコールを確認します(Linuxを使用している場合、他のユニスには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を使用して)送信する場合、それも同様に機能します。

5
sch

ブロードキャストトラフィックを127.255.255.255に送信するすべき動作しますが、明らかにテストします(ここではWireshark/tcpdumpがあなたの友達です)。

明らかに、クライアントはループバックデバイスでもリッスンする必要があります。

0
gravyface