web-dev-qa-db-ja.com

Netcat:UDP接続は終了しませんか?

簡単な例です。これが私のサーバー/ホストです。

nc -ul 192.168.0.2 54 

そしてクライアント:

echo "test" | nc -u 192.168.0.2 54

サーバーは「テスト」メッセージを傍受しますが、ncは閉じません。 EnterキーまたはCtrl + cを押すまで開いたままになります。自動的に終了させることはできますか?または、送信が終了したことを示すために、クライアントメッセージに何かを含めますか?

nc --version
Ncat: Version 7.70 ( https://nmap.org/ncat )

私はDebianとmacOSを使用しています。

2
user321630

TCPには開始と終了のある接続の概念がありますが、UDPにはそれがありません。UDPはコネクションレス型プロトコル:UDPレシーバーは単に着信を待機します指定されたUDPポートでパケットを送信し、到着したUDPパケットの内容を出力します。

受信側のncには、着信する可能性のあるパケットの数や、それらのパケットがすべて同じホストから着信するのか、複数のホストから着信するのかがわかりません。指定されたUDPポートに到着するものをすべて受信するだけです。 ncプロセスが中断されるまで、UDPパケットの内容を解析せずに標準出力に出力します。

クライアント/送信者によって送信されたパケットが受信側で同じ順序で受信されるという組み込みの保証すらありません。パケットは途中で失われたり、並べ替えられたりする可能性があります。 UDPはそれを修正しようとはしません。それは、UDPを使用して、その目的に応じてこれらすべての問題を処理する(または無視する)ことの仕事です。

特定の文字列を決定し、それを「データの終わり」を意味するようにし、リスニングエンドで別のスクリプトを配置して、着信データを解析し、その文字列を受信したときにリスニングncプロセスを強制終了することができます。このようにして、UDP上に独自の(おそらく非常に単純な)プロトコルの構築を開始します。 そしてそれはまさにUDPが設計された目的です。

一言で言えば、「nc -ulを自動的に終了させることは可能ですか?」に対する答えです。 「いいえ、それを行う何かを作らない限り」です。

1
telcoM

netcatにはオプション-W

-W recvlimit    Terminate after receiving a number of packets

そう:

nc -ulW 1 192.168.0.2 54

しかし、あなたはncatを使用しています。この回避策を使用できます。

nc -ul 192.168.0.2 54 -c 'dd count=1 bs=100000 >&3' 3>&1
1
user23013