socat udpが1つのパケットまたはタイムアウトを受信することを制限する

socat udpが1つのパケットまたはタイムアウトを受信することを制限する

過去にいくつかのマルチキャスト接続をテストしたとき、私はsocatを使って次のようにしました。

socat -u UDP4-RECVFROM:12345,add-membership=224.1.2.3:eth0,fork,reuseaddr,readbytes=32 SYSTEM:"hexdump -C"

その後、一部のパケットが表示されるか、1〜2秒後に何も表示されない場合は、Ctrl-Cを押します。

これは、何百ものマルチキャストアドレスでこれを実行する必要があるとき、特にそれらの一部が毎秒数万のパケットを送信する場合(ctrl-cを押すことができるよりも5000早くロード)、これは明らかにトリミングされていない実際になります。

socatが1つのパケットだけを受信して​​終了することを制限する方法は?また、何も受信されないときにタイムアウトをどのように設定しますか? (-Tパラメータを試しましたが、何も機能しないようです。)

ベストアンサー1

socat cmdlineスイッチ-TはUDP4-RECV:でのみ機能し、UDP4-RECVFROM:では機能しないようです。ただし、UDP4-RECVの場合は,fork機能しないため、最初のパケット以降は停止する必要があります。

これにより、次の可能性が残ります。

socat -u udp-recvfrom:8500,add-membership=224.1.2.3:eno1,readbytes=32,fork SYSTEM:"hexdump -C && kill 0" & pid=$!; sleep 10;kill $pid

,fork各 udp パケットに対して新しいプロセスが開始されると、そのSYSTEM:"hexdump -C && kill 0"パケットの後に socat プロセスグループが終了します。元のコマンドラインにそれを残しreadbytes=32たので、パケットの最大32バイトを読み取ることができます。

パケットが到着しない場合のタイムアウト部分は少しトリッキーで、バックグラウンド、ソカット、スリープモード、ソカットシャットダウンが必要なため、良い解決策はありません。

パケットが受信されると、kill $ pidはプロセスを見つけられなくなり、エラーが発生します。この問題はまだ生きていることを確認することで解決できます。

とにかく、これはうまくいくでしょう。

おすすめ記事