を介してメッセージを送信しようとしていますnetcat
。メッセージを送信した後netcat
は終了する必要があります。
私は以下を試しました:
cat tsmmessage.bin | nc -u localhost 4300
nc -u localhost 4300 < message.bin
この-q
オプションには以下が指定されています。
-q秒
stdinでEOF後、指定された時間(秒)を待って終了します。秒が負の場合は永遠に待ってください。
しかし、
nc -q0 -u localhost 4300 < message.bin
動作しません。
私は何を見逃していますか?
答え1
EOFを送信した後に接続がアイドル状態にあると仮定すると、0と同じ-w timeout
オプションを使用できますtimeout
(愚かな-q
オプションとは異なり...)。
cat tsmmessage.bin | nc -u localhost 4300 -w0
答え2
この-q
フラグがないと、インスタンスはnetcat
永遠に待機します。 UDPには「ストリーム終了」メッセージがないため、これをnetcat
知る方法はありません。標準入力そしてネットワーク接続が完了しました。
たとえば、TCP / IPを使用すると、期待どおりに機能します。
nc -l localhost 4300 # Window 1
nc localhost 4300 </etc/group # Window 2
しかし、あなたが決めたように、UDP / IPではこれは終わりません。
nc -u -l localhost 4300 # Window 1
nc -u localhost 4300 </etc/group # Window 2
これが-q
ロゴが作用するところです。ただし、残念ながら値は許可されません0
。また、整数以外の値も許可されません。これはtimeout
、他の外部ユーティリティに依存せずに私が提供できる最良の選択肢です。
nc -u -l localhost 4300 # Window 1
nc -q 1 -u localhost 4300 </etc/group # Window 2
ここでもnetcat
鑑賞時間をエレガントに仕上げることはできません。 (-w
タイムアウトオプションは無視され、-q
関連はありません。)これは実際の状況で役に立つ可能性があるため、netcat
90秒後に終了します。
timeout 90 nc -u -l localhost 4300 # Window 1
nc -q 1 -u localhost 4300 </etc/group # Window 2
答え3
UDPプロトコル
# listen on receiver
nc -u -l localhost -p 4300
# sender
cat tsmmessage.bin | nc -u -N -q 0 localhost 4300
TCPプロトコル
# listen on receiver
nc -l localhost -p 4300
# sender
cat tsmmessage.bin | nc -N localhost 4300
編集:このソリューションは
openbsd-netcat
説明に従って機能し、GNU Netcat
以下では機能しません。Archlinux
答え4
かなり移植可能なオプションは、SIGHUPをクライアントインスタンスに送信することですnc
。例:
kill -1 <pid of nc>
または
pkill -1 nc
これはデータフローが完了して接続を完全に閉じる必要がありますが、ncがまだ実行されている場合にも当てはまります。これは、移植性の問題によりシャットダウンできない環境で発生する可能性があります。