![使用输入/输出命名管道进行 TCP 连接](https://linux22.com/image/48485/%E4%BD%BF%E7%94%A8%E8%BE%93%E5%85%A5%2F%E8%BE%93%E5%87%BA%E5%91%BD%E5%90%8D%E7%AE%A1%E9%81%93%E8%BF%9B%E8%A1%8C%20TCP%20%E8%BF%9E%E6%8E%A5.png)
我一直在摆弄让它工作一段时间,所以我怀疑对管道工作原理的某种根本性误解是我遇到麻烦的根本原因。
我的目标是通过启动与某个远程主机的 TCP 连接netcat
,并在文件系统上有两个命名管道:一个进程可以从中读取以获取传入数据,另一个进程可以写入作为传出数据。我目前正在使用以下结构:
mkfifo in
mkfifo out
cat out | netcat foo.bar.org 4000 > in &
从这里,我想允许其他进程读取和写入此打开的 TCP 连接。这是否应该“正常工作”,或者是否有原因导致这样的构造无法工作?
什么似乎目前发生的情况是,我可以out
毫无问题地读取,但是当我写入时,in
我得到的输出提到管道损坏,并且所有后续通信似乎都已停止。想法?
(相关:我最初使用:
netcat foo.bar.org 4000 < out > in &
但发现它阻塞等待输入。我对此也很好奇,但最好在一个单独的问题中解决。)
答案1
cat out | netcat foo.bar.org 4000 > in &
我认为问题是cat
一旦EOF
从out
管道接收到,就会退出。当cat
退出时,管道的其余部分(包括netcat
)也会终止。
尝试这样的事情:
while true; do cat out; done | netcat foo.bar.org 4000 > in &
因此,cat
根据需要经常重新启动,并且管道EOF
中出现的任何问题out
都会得到有效处理。
答案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 键后)。关闭此命令也会关闭连接。
答案3
Steven Monday 的分析对我来说看起来不错:cat
在第一次写入后返回,out
因为 fifo 是empty
。为了避免这种情况,解决方案是保持一个以写入模式打开 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)
。)
另一个例子这里。