ブロードキャストUDPパケットを送信するサーバーと、同じマシン内の他の2つのクライアントがそれらを受信するようにしたい。どういうわけかできますか?どのIPアドレスを使用しますか?
@gravyfaceは私に希望を与えましたが、私は試しました:
どれも動作しませんでした! :(
OBS:REUSE_ADDRおよびSO_BROADCASTオプションを使用しています。
最初のウィンドウ:
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を使用して)送信する場合、それも同様に機能します。
ブロードキャストトラフィックを127.255.255.255に送信するすべき動作しますが、明らかにテストします(ここではWireshark/tcpdumpがあなたの友達です)。
明らかに、クライアントはループバックデバイスでもリッスンする必要があります。