TCP接続にin / out名前付きパイプを使用する


15

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

私の目標は、リモートホストへのTCP接続を開始netcatし、ファイルシステム上に2つの名前付きパイプを作成することです。1つはプロセスから読み取りデータを取得し、もう1つはプロセスが送信データとして書き込むことができます。現在、次の構成を使用しています。

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

ここから、他のプロセスがこのオープンTCP接続との間で読み書きできるようにしたいと思います。これは「うまくいく」のでしょうか、それともこのような構成が機能しない理由がありますか?

現在何が起こっているように見えるかはout問題なく読むことができるが、私が書いたときin、壊れたパイプを言及する出力が得られ、その後のすべての通信は死んでいるように見える。考え?

(関連:私はもともと使用しました:

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

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

回答:


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

問題は、パイプからcatを受信するとすぐに終了することだと思います。また、終了すると、パイプラインの残り(を含む)も終了します。EOFoutcatnetcat

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

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

したがって、cat必要に応じて頻繁に再起動さEOFれ、outパイプに表示されるs は効果的に処理されます。


私はこれを試しましたがwrite(stdout): Broken pipeoutパイプへの書き込み後(または直後)に受信します。
noffle

2

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

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

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

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

サーバーから送信されたものをすべて印刷します(使用している場合は実行し続けます) in、終了時に一方の端をnetcat閉じ、接続を閉じるアプリケーションでfifoます)。

cat in &

そして同じ端末で:

cat > out

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


自分で試してみるとそうではnetcat -t -l -p 4000 < loopFF | tee loopFFないことがわかりますが、なぜそれ自体で無限のフィードバックループが発生しないのですか?
-noffle

@noffle。なぜなら、私が言ったように、netcatそのネットワーク接続の1つが閉じるたびに閉じるからです。クライアントを閉じると(文字列を送信し、同じ文字列を受信する)、netcatサーバーも閉じられます。この場合、複数のクライアントとクライアントの再接続を処理するために自分自身を分岐させるサーバーコードを自分で作成しました。
-saeedn

2

スティーブン・マンデーの分析は、私には良さそうです:fifoがであるため、cat最初の書き込み後に戻ります。これを回避するための解決策は、fifoを書き込みモードで開いたプロセスを維持することです(以下の例では1番目)。outemptycat

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

(out-pidファイルは、すべてを停止する方法ですkill -9 $(cat out-pid)

ここに別の例。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.