これは linux-NetcatがUDPトラフィックのリッスンを停止する-スーパーユーザー に近いと思いますが、とにかく質問した方がいいと思いました
限り netcatのバージョン 私はUbuntu 11.04を使用しており、そのデフォルトのnetcat
を使用しています。これはopenbsd
の1つだと思います。
$ nc
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
[-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
[-x proxy_address[:port]] [hostname] [port[s]]
これは私が奇妙に思うことです:最初のケースは期待通りに機能します-私は1つのターミナルでUDPサーバーを開きます:
$ Sudo nc -ul 5000
...そして別の端末で新しいUDPクライアント接続を開始し、hello
を3回入力して、それぞれの後にEnterキーを押します。
$ nc -u 127.0.0.1 5000
hello
hello
hello
^C
...そしてサーバーターミナルに戻ると、期待どおりにhello
が3回印刷されています。
$ Sudo nc -ul 5000
hello
hello
hello
^C
これまでのところ、すべてが期待どおりに機能します。ただし、クライアントに入力をパイプすることによって、同じことを今やってみるとしましょう。したがって、最初に1つの端末でUDPサーバーを確立します。
$ Sudo nc -ul 5000
...そして別のデータでは、UDPクライアントとしてnc
にデータをパイプします。
$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C
...クライアントコマンドの後、シェルは一種の入力待ちのようにフリーズします。そのため、ここでhello
と入力し、Enterキーを2回押します。しかし、サーバーは最初のhello
(echo
を介してパイプされた)のみを登録しました。さらに、Ctrl-Cを押してクライアントのecho hello | nc -u 127.0.0.1 5000
コマンドを繰り返し実行しても、サーバーはstillを報告したままになります。最初のhello
:
$ Sudo nc -ul 57130
hello
^C
...そしてCtrl-Cでサーバーを停止して再起動した後にのみ、クライアントのecho hello | nc -u 127.0.0.1 5000
コマンドを繰り返して、サーバーが機能していることを確認できます。
これはnc
の動作が想定されている方法ですか?サーバーを再起動しなくても、少なくともecho hello | nc -u 127.0.0.1 5000
への繰り返し呼び出しが登録されると思いますか?それとも、そのような動作のための特別なコマンドラインスイッチがあるのでしょうか。
編集:私はこれを見つけましたPDFプレゼンテーション: socat –すべての種類のソケットの処理 、これには次のnetcat
対socat
が含まれていますノート:
netcat-制限
●ワンショットのみ(ソケットのクローズ後に終了)
...
例1:netcatの置き換え
...
●送信元ポートを持つUDPクライアント:
nc -u -p 500 1.2.3.4 500
socat-udp:1.2.3.4:500、sp = 500
●TCPサーバー:
nc -l -p 8080
socat-tcp-l:8080、reuseaddr
...
...ただし、サーバーコマンドを "socat - udp4-listen:5000,reuseaddr
"に置き換え、クライアント行を "socat - udp:127.0.0.1:5000
"に置き換えると、上記と同じ動作が得られます...パイプで入力、 "echo hello | socat - udp:127.0.0.1:5000
"、唯一の違いは、ここでは少なくともWord hello
が送信された後にコマンドが存在することです。ただし、このコマンドを連続して実行しても、サーバー、サーバーが再起動されるまで。
OK、少なくともsocat
で何かを得たと思います。つまり、オプションfork
をサーバー行に追加する必要があります。
$ socat - udp4-listen:5000,reuseaddr,fork
...次に、別の端末で、コマンドラインでecho
パイプラインをsocat
クライアントラインに複数回呼び出すことができます。これは、すぐに終了するためです(まあ、0.5秒後:)):
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
...そして最初のターミナルに戻ると、サーバーが3つすべてのhello
sを正常に表示していることがわかります。
$ socat - udp4-listen:5000,reuseaddr,fork
hello
hello
hello
^C
fork
- ed socat
サーバーを使用している場合でも、echo "hello" | nc -u 127.0.0.1 5000
は、ユーザーの入力を待つように「ロック」されます。ただし、Ctrl-Cを押してコマンドを再実行すると、次のようになります。
$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C
... fork
- ed socat
サーバーは、再起動する必要なく、3つのhello
sを表示します。
どうやら、このopenBSD netcat
にはfork
オプションがないようですが、それに対応するものがあるかどうかはわかりません。
とにかく、これが誰かを助けることを願って、
乾杯!
Netcatは、echoのstdoutからの出力を読み取るときにパイプを使用しているだけで、キーボードに「接続」されていません。期待どおりの応答を得るには、3つの「hello」をファイルに追加して実行します。
cat [myfile] | nc -u 127.0.0.1 5000
待ち受けncのトレースを行うと、netcatが接続を待機していることが示され、接続を取得すると、そのホストとポートに接続し、他はすべて無視します。続行するには「-k」を追加し、0秒後に各接続をタイムアウトするには「-w 0」を追加する必要があります。 Socatの方が良いと思います。