簡単な例として、以下は私のサーバー/ホストです。
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を使用しています。
答え1
TCPには開始と終了の接続概念がありますが、UDPにはありません。 UDPは接続プロトコルなし:UDPリスナーは、指定されたUDPポートから着信パケットを待ち、到着するUDPパケットの内容を印刷します。
受信者は、nc
どのくらいのパケットが入ってくるのか、そのパケットがすべて同じホストから来るのか、複数のホストから来るのかを知りません。指定されたUDPポートに到着するすべてを受信して送信するUDPパケットの内容を出力します。nc
プロセスが中断されるまで、何らかの方法で解析せずに標準出力を生成します。
クライアント/送信者が送信したすべてのパケットが受信側で同じ順序で受信されるという基本的な保証はありません。途中でパケットが失われたり、並べ替えられたりする可能性があります。 UDPはこの問題を解決しようとしません。 UDP を使用して、目的に合わせてこれらすべての問題を処理または無視します。
「データの終わり」を意味する特定の文字列を決定し、受信側の他のスクリプトから着信データを解析し、nc
その文字列が受信されると受信プロセスを終了させることができます。このようにして、UDPの上に独自の(おそらく非常に単純な)プロトコルを構築し始めます。これがUDPが設計された理由です。
nc -ul
簡単に言うと、「自動シャットダウンは可能ですか?」という質問に対する答えは次のとおりです。 「いや、そんなことをしない限りはいけません。」
答え2
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