2017-09-18 17 views
0

netcat経由で要求をプログラムに送信し、その要求に対する応答をリッスンする場合、netcatは最初の8192バイトのみを受信し、終了します。ここでnetcatは8192バイト後に接続を終了します

詳細は以下のとおりです。 何かが私のソフトウェアは、8192バイトよりも間違いなく大きいとのnetcatにそれを送り返す応答を生成netcatを、パイプ

echo "something" | netcat -q 10 -i 3 -w 10 localhost myport 

を使用して送信されます。私はすべてのバイトが実際に私のプログラムからnetcatに送り返されることを検証したので、問題はありません。 コマンドラインバージョンが使用されている場合:

netcat -q 10 -i 3 -w 10 localhost myport 
something 

すべてのバイトは、アプリケーションからの送信が受信されています。受信したバイト数を変更するために-q -iと-wフラグにさまざまな組み合わせを試しましたが、パイプコマンドのバージョンでは常に8192です。

どのように修正できますか?

答えて

1

これは、netcatが標準入力からファイルの終わりを受信して​​いるために発生しています。つまり、コマンドecho "something"something\nという文字列をnetcatの標準入力に接続されたパイプに送信します。パイプが閉じられる(echoコマンドが終了したため)。パイプの最初のreadではnetcatがその文字列を受け取りますが、その次のreadではEOFを受け取ります。これにより、ピアが送信を終了しなくても、ピアへの接続が切断されます。

基本的には、netcatは標準入力をそのままソケットに送り、の1つが閉じられるまでソケットを標準出力に送り続けます。それから終了します。

ソケット上でEOFを取得する前に、netcatが標準入力でEOFを受け取らないようにするだけで何かする必要があります。このような何かありそうなそれを行います。

(echo "something" ; sleep 1) | netcat localhost $myport 

echo "something"の出力はのnetcatの入力に接続された配管に送信されますが、sleep 1も、両方のコマンドがで始まっているので、完了するまでパイプが実際に閉鎖されることはありませんパイプの書き込み端に接続されたサブシェル。 (ピアが送信する金額が大きい場合は、眠っている秒数で微調整する必要があるかもしれません。)

+0

ありがとう、それは本当に役に立ちました。最後のコマンドをテストした後、 '(echo" something "; sleep" $ SLEEP_TIMER ")| nc -q 2 localhost $ myport'と入力します。これにより、送信されるすべてのデータに対してパイプが十分に長く維持されます。ここで、$ SLEEP_TIMERはcaに対して2に設定されています。 80kbのデータ。 – Aeonos

関連する問題