nc を使用して TCP ポートを無期限にリッスンするにはどうすればよいですか?

nc を使用して TCP ポートを無期限にリッスンするにはどうすればよいですか?

特定の TCP ポートに到着するデータを無期限に読み取り、そのデータをファイルにダンプしたいです。さまざまなバリエーションを試しましたが、ncうまくいきません。ほとんどの場合、コンソールにエラーは表示されません。以下は私が試した方法です。

nc -lv 12345 >> ../myfile
nc -v 12345 >> ../myfile
nc -v -p 12345 >> ../myfile
nc -v localhost -p 12345 >> ../myfile

あなたの助けに感謝..

答え1

特定のTCPポートに到着したデータを無期限に読み取りたい

これはあまり意味がありません... UDP ポートに到着するすべてのデータを追いかけているのであれば問題ありませんが、TCP は接続ベースのプロトコルです。クライアントが接続すると、accept()2 つのソケット (1 つはリスニング用、もう 1 つはクライアントに接続) が作成されます...nc元のリスニング ソケットを閉じて、クライアントと 1 対 1 で処理します。


複数のクライアントの接続をリッスンしたい場合は、以下を使用してみてくださいsocat

socat TCP-LISTEN:12345,fork FD:1 >> ../myfile

これにより、リスニング ソケットが設定され、接続時に新しいプロセスがフォークされ、リスニング ソケットはリスニング状態を維持します。受信したすべてのデータは stdout (ファイル記述子) に書き込まれ1、追加のために にリダイレクトされます../myfile

注記: データは任意の数のクライアントから受信されますが、順序は保証されず、フレーミングも行われません。つまり、一度に複数のクライアントが存在する場合、データがごちゃごちゃになります。


socatファイルを自動処理したい場合は、CREATEまたはOPENマニュアルページ):

socat TCP-LISTEN:12345,fork OPEN:../myfile,append

一度に1人のクライアント" アプローチを採用し、ncループを挿入します。

while :; do nc -l 12345; done >> ../myfile

これを次のようにテストしますnc:

nc localhost 12345

答え2

左の画面

nc -l 1234 サーバーを起動します。

右側の画面が nc 127.0.0.1 1234接続されます。

コマンドが間違っているようです。

GNU 版と BSD 版のどちらを使用しているかも知っておく価値があります。私のは BSD 版です。man nc を実行すると、「NC(1) BSD 一般コマンド マニュアル」が表示されます。GNU 版でサーバーを起動するには、-l と -p が必要になる場合があります。どのポートでもクライアントをサーバーに接続するために、-p は使用しないでください。

ここに画像の説明を入力してください

-vも使用できます

ここに画像の説明を入力してください

差し迫った問題は、それがまったく動作しなかったことです。

あなたの質問は、それが無期限であるかどうかについて尋ねていますが、クライアント側で Ctrl + C を実行すると、接続が切断されるだけでなく、サーバーも停止することに注意してください。そのサーバーをループでリッスンさせることができます。これは機能します。そうすると、サーバーはリッスンし続け、クライアントから Ctrl + C の後に再度接続しようとしても、サーバーはそこにあります。

ここに画像の説明を入力してください

関連情報