使用输入/输出命名管道进行TCP连接


15

我一直很想让它工作一段时间,所以我怀疑对管道如何工作的某种根本误解是造成麻烦的根本原因。

我的目标是通过netcat文件系统上的某个远程主机启动TCP连接,并在文件系统上有两个命名管道:一个可以读取进程以获取传入数据,另一个可以写入进程作为传出数据。我目前正在使用以下构造:

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

从这里开始,我想允许其他进程对该开放的TCP连接进行读写。这应该“起作用”,还是有这样的构造不能起作用的原因?

什么似乎目前发生的是,我可以读取out没有问题,但是当我写到in我得到的输出提一个破碎的管道和所有后续通信似乎是死了。有什么想法吗?

(相关:我最初使用:

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

但发现它阻止了等待输入。我对此也很好奇,但最好在一个单独的问题中解决。)

Answers:


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

我认为问题在于,cat一旦它收到管道发出EOFout通知就会退出。当cat退出时,其余管道(包括netcat)也将终止。

尝试这样的事情:

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

因此,cat可以根据需要重新启动,并且可以有效地处理管道中EOF出现的所有错误out


我尝试了此操作,但write(stdout): Broken pipe在写入out管道后(或之后不久)仍然收到。
2012年

2

我也遇到过这个问题。主要的问题是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键后)。关闭此命令也将关闭连接。


我可以看到并不是我自己尝试一下的情况,但是为什么不netcat -t -l -p 4000 < loopFF | tee loopFF导致自身的无限反馈循环呢?
noffle 2012年

@noffle,因为正如我所说,netcat它将在其网络连接之一关闭时关闭。如果关闭客户端(发送一个字符串并接收相同的字符串),netcat服务器也将关闭。在这种情况下,我为自己编写了一个服务器代码,可以分叉以处理多个客户端并重新连接客户端。
saeedn 2012年

2

史蒂文·星期一的分析对我来说似乎很好:因为fifo是catout因此在您第一次写信后返回empty。为了避免这种情况,解决方案是保持进程在写模式下打开fifo,在cat下面的示例中为第1个:

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

(out-pid文件是停止整个操作的方法:kill -9 $(cat out-pid)。)

这里的另一个例子。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.