TCPデータの受信をテストする必要があります。私許可されていませんiperfを使用してください。
要件は、誰かが任意のデータを送信するTCPサーバーを作成する必要があることです。受信したバイト数を計算する必要があります。
以下を使用するように指示されました。
timeout 60 cat < /dev/tcp/IP_addr/port | wc –c > byte_count-n.txt
これは彼らが考える効果をもたらすでしょうか? 60秒間データを受信してからタイムアウトが期限切れになったら、受信したデータをパイプしてwc
合計をディスクファイルに書き込みますか?
プログラマーとしてこれを見るともっと嬉しかったです。
(timeout 60 cat < /dev/tcp/IP_addr/port) | wc –c > byte_count-n.txt
しかし、明らかにシェルはこれを受け入れません。私の懸念は正しいですか?
Ashシェルを使用していますが、Bashのみをサポートしているという懸念があります。/dev/tcp
ベストアンサー1
この回答を参照してください質問の以前のバージョンこのコマンドの元の意図は次のとおりです。仕える人。
いいえbash
(およびksh
この機能のソース)/dev/tcp/host/port
は、次のためのものです。顧客TCP接続。
シェルはつながるホスト:ポートに接続し、その接続のソケットをリダイレクトトピックのfdに設定します。 orを使用する<
と<>
fd 0(stdin)、を使用すると>
fd >>
1になりますが、演算子に違いはありません。<
特にシェルを使用してもソケットの転送方向を閉じることはありません。 stdinはまだ読み書き可能なソケットに接続されています。
(サーバーとして)1つ以上の接続を受信して受け入れたい場合は使用できません/dev/tcp/host/port
。
組み込みツールなどの組み込みサポートを備えたシェルなどの専用socat
ツールを使用する必要があります。nc
zsh
ztcp
timeout 60 socat -u tcp-listen:12345,reuseaddr,bind=127.0.0.1,fork - | wc -c
ループバックIPv4アドレスのポート12345をリッスンし、子プロセスから着信接続を受け入れて、リスンした内容をstdout(ここにパイプされますwc
)に書き込みます。
nc
netcat
同じタスクを実行するために一般的に使用できるツールのいくつかの実装があります。
timeout 60 nc -l 127.0.0.1 12345 | wc -c
60秒間コマンドを実行することに注意してください。これには、着信接続を待って何もしない時間が含まれます。
着信接続でタイマーを開始するには:
socat -u tcp-listen:12345,reuseaddr,bind=127.0.0.1 'EXEC:timeout 60 cat' | wc -c
ここでは、1つのTCP接続のみが許可され(no fork
)にパイプされますtimeout 60 cat
。
このスレッドで質問する内容を明確にするには、次のようにします。
cmd1 | cmd2
実行されずに完了するcmd1
と、データはに転送され、同時に開始されます(並列に実行されます)。 2つの間にパイプがあります(cmd2のstdoutはパイプの書き込み終了です。cmd2のstdinは読み取り終了です)。cmd2
cmd1
cmd2
cmd1
存在する:
timeout 60 nc -l 127.0.0.1 12345 | wc -c
すでにtimeout
並列実行中ですwc
。timeout
これを実行する別のプロセスを開始しますnc
(同じ標準出力を共有します)。
timeout
60秒後、殺すその別のプロセス。この時点で終了しますが、nc
ソケットから受け取った内容をパイプに書き込みます(nc
またはsocat
出力をバッファリングしません)。wc
まだ読んでいなくても、wc
読み続けるように扱われます。パイプが排水されます。
(timeout 60 nc ...) | wc –c
同じでしょう。(code)
サブシェル(ksh93以外のシェルで評価されるサブシェルプロセス)を起動しますcode
。ただし、ここではパイプラインの一部なので、コードはすでにサブシェルに存在する必要があります(パイプラインの異なる部分は同時に実行されるため、異なるプロセスで実行する必要があります)。