を使用しようとしていますsocat
。小さなペイロードを使用して明確に定義されたポートにUDPブロードキャストを送信し、ネットワーク上のこれらのデバイスから「応答」を受信して検索を実行します。
双方向を使用socat
し、「応答」が標準出力に移動すると機能します。
echo -ne "\x00\x01\x00\xF6" | socat -t5 - udp-datagram:255.255.255.255:30718,broadcast |xxd -p
私のローカルネットワーク上の一部のデバイスのサンプル応答(各行は他のデバイスからの応答です):
000000f70020300258366d112c15000062a71b21ff0000000080a3d2ded9
000000f70020300258366d112c15000062a71b21ff0000000080a3a40670
000000f70020300258366d112c15000062a71b21ff0000000080a3b94ca0
000000f70020300258366d112c15000062a71b21ff0000000080a3a4046b
ペイロードは予想通りです。しかし、私が逃しているのは発信者のメタデータです。特にip-pktinfo,fork SYSTEM:
。SYSTEM
一方向モードのいくつかのバリエーションを試しましたが、-u
リスナーからデータを受信できないようです。
# Listener:
socat -u udp-recvfrom:30222,reuseaddr,ip-pktinfo,fork SYSTEM:./test.sh &
# Broadcast:
echo -ne "\x00\x01\x00\xF6" | socat -u - udp-datagram:255.255.255.255:30222,sourceport=30222,broadcast,reuseaddr
「こちら」のソースポートはランダムである可能性があるため、30222
ブロードキャストソースポートが応答リスナーと一致するように明示的に選択します。たとえば、ブロードキャストがポート9987から来ると、クライアントはユニキャスト応答をポート9987に返します。私がこのように一方向放送をしているなら、私はそうします。時々応答を得るには、放送プロセスがどれだけ早く終了するかによって異なります。
(次はパケットキャプチャを確認する予定です。リモートシステムでテストされているため、最初にメモリを更新する必要があります。tcpdump
)
引用:
答え1
OPでは、ip-pktinfo
これは通常Linuxソケットオプション(に使用されているIP_PKTINFO
)と呼ばれていました。以下ではLinuxを想定します(ただし、最後に* BSDの注意事項を参照)。このオプションは実際には必須ではありませんが(最後の注意を参照)、詳細を確認するために追加できます。
重要な部分はreuseport
トグルを使用するオプションです。SO_REUSEPORT
ソケットオプション:
SO_REUSEPORT
(Linux 3.9以降)複数のAF_INETまたはAF_INET6ソケットを同じソケットアドレスにバインドできます。このオプションは、ソケットからバインド(2)を呼び出す前に、すべてのソケット(最初のソケットを含む)に設定する必要があります。ポートのハイジャックを回避するには、同じアドレスにバインドされているすべてのプロセスに同じ有効なUIDが必要です。このオプションはTCPおよびUDPソケットに使用できます。
OPにはこのオプションがないことを除いて、必要なものがすべてあります。
主に他の読者の利益のために行われた作業を説明し、完全な例を示します。
もしソカットこのコマンドは、制限のため操作を実行しません。 2つを使用してください。ソカットこの場合、全二重通信チャネルを2つの一方向チャネルに分割する。
1 つは回答の再読み込みに使用され、もう 1 つはブロードキャストの送信に使用されます。つまり、解決策ソカット制限する、読むソカットandとUDP-RECVFROM
一緒に使用する必要があります(読み取り専用なので、結果は次のようになります)。fork
-u
標準出力、回答者に返送されるのではなく)通常、自然な選択の代わりに:UDP-RECV
つまり、パケットごとにコマンドを分岐し、環境変数を介して各パケットのメタデータを送信できます。また、OPが作成したように、ポートはすべて同じポートを使用するように事前に選択する必要があります。-u
応答を再度読み、他のプライベートソケットに盗む危険を避けるために、送信ソケットも使用する必要があります。ソカット注文する。
以下は、ローカルシステムに192.0.2.2/24があり、ピアシステムに192.0.2.3/24を持つLANの例です。
ピアシステム(応答者)の命名仲間:
$ socat udp4-recvfrom:30718,fork system:hostname
ローカルシステムのterm1(オプションで利用可能,ip-pktinfo
):
$ socat -u udp4-recvfrom:30222,reuseport,fork system:'cat; printenv|grep -E \"SOCAT_.*(ADDR|PORT)\"'
ローカルシステムの用語2:
$ echo dummyprobe | socat -u - udp-datagram:255.255.255.255:30718,bind=:30222,reuseport,broadcast
1学期中に受け取った回答:
peer
SOCAT_PEERADDR=192.0.2.3
SOCAT_PEERPORT=30718
ノート
FreeBSDにも同様の説明があります。
SO_REUSEPORT
(より具体的には、Linuxは最近* BSDに合わせて調整されました。):SO_REUSEPORT
ポートをバインドする前にすべてSO_REUSEPORTを設定した場合は、複数のプロセスによる正確な冗長バインディングが許可されます。このオプションを使用すると、プログラムの複数のインスタンスがバインドされたポートに向かうUDP / IPマルチキャストまたはブロードキャストデータグラムをそれぞれ受信できます。ip-pktinfo
検索は不要仲間住所検索が必要です地元のマルチホームシステムにとって最も便利なアドレスであるため、複数のアドレスのどれがデータグラムを受信したのか、受信したデータグラムがブロードキャストであるかどうかもわかります。このオプションがなくても、ピアのアドレス情報は常に利用可能です。 * BSDは同じ情報を受け取るためにこのオプションをip-recvdstaddr,ip-recvif
(=>IP_RECVDSTADDR
+)に置き換えます。IP_RECVIF