web-dev-qa-db-ja.com

TCP接続での名前付きパイプの入出力

私はこれをしばらく機能させるためにいじっていますので、パイプがどのように機能するかについてのある種の根本的な誤解が私のトラブルの根本的な原因であると思います。

私の目標は、netcatを介して一部のリモートホストへのTCP接続を開始し、ファイルシステムに2つの名前付きパイプを持っていることです。これらのプロセスは、送信データとして機能するように書き込みを行うことができます。

mkfifo in
mkfifo out
cat out | netcat foo.bar.org 4000 > in &

ここから、私は他のプロセスがこのオープンから読み書きできるようにしますTCP=接続。これが「うまくいく」か、またはこのような構造ができる理由があります '働く?

現在発生しているseemsは、outから問題なく読み取ることができるということですが、inに書き込むと、壊れたパイプとその後のすべての通信についての出力が表示されます死んでいるようです。考え?

(関連:私が最初に使用した:

netcat foo.bar.org 4000 < out > in &

しかし、入力待ちをブロックすることがわかりました。これについても知りたいのですが、おそらく別の質問で対処する方がよいでしょう。)

15
noffle
cat out | netcat foo.bar.org 4000 > in &

問題は、catEOFパイプからoutを受信するとすぐに終了することです。そして、catが終了すると、残りのパイプライン(netcatを含む)も終了します。

代わりに次のようなものを試してください:

while true; do cat out; done | netcat foo.bar.org 4000 > in &

したがって、catは必要に応じて何度でも再起動され、EOFパイプに現れるoutsは効果的に処理されます。

6
Steven Monday

私もこの問題に直面していました。主な問題はnetcatです。これは優れたツールですが、接続されている入力ファイル記述子または出力ファイル記述子のいずれかが閉じられると、接続を閉じます。サーバーがリッスンしていないときは何もせず、他のピアが閉じているときに終了します。サーバーを正しく設定し、ファイル記述子を開いたままにしておけば、サーバーは機能します。たとえば、私は次のシナリオをテストし、それは非常にうまくいきました:端末のセットアップでエコーサーバー(私は以下のようにセットアップしました):

mkfifo loopFF
netcat -t -l -p 4000 <loopFF | tee loopFF

別のターミナルで、サーバーへのfifo接続をセットアップします。

mkfifo in
mkfifo out
netcat 127.0.0.1 4000 <out >in &

サーバーが送信したものをすべて出力します(終了時に一端を閉じるアプリケーションでin fifoを使用すると、netcatは接続を閉じます)

cat in &

そして同じターミナルで:

cat > out

ここで、入力したものはすべて(Enterキーを押した後)再び印刷されます。このコマンドを閉じると、接続も閉じます。

2
saeedn

Steven Mondayの分析は私には良さそうです。FIFOがcatであるため、outemptyへの最初の書き込み後に戻ります。それを回避するための解決策は、書き込みモードでfifoを開いた状態でプロセスを維持することです。次の例では、最初のcatを使用しています。

_mkfifo in
mkfifo out
cat > out &
echo $! > out-pid
cat out | netcat foo.bar.org 4000 > in &
_

(out-pidファイルは、全体を停止する方法です:kill -9 $(cat out-pid)。)

別の例 here

2
jfg956