如何从管道中去除 EOF?或者:如何将尾巴 -f 与网猫一起使用?



我正在尝试通过TCP传输XBoard象棋命令。我知道nc在看到EOF时会关闭连接。

示例1

$ nc -l 1301 | hd &
[1] 10241
$ echo -en "babab" | nc localhost 1301
00000000  62 61 62 61 62                                    |babab|
00000005
[1]+  Done                    nc -l 1301 | hd
$

这就是我的问题,我只是觉得我需要找出如何实现它,这样上面的nc -l命令就不会终止。我读到我可以使用tail -f,但除非我使用文件或FIFO,否则这似乎不起作用。下面是一个类似问题的解释(我认为),它促使我寻找这个问题的解决方案:

示例2

我想在浏览器中运行一个XBoard Chess引擎,并通过WebSockets进行通信。因此,我推出XBoard如下:

./websockify 2023 -- xboard -fcp "nc -q -1 -k -l 2023"

它启动了,webstockify似乎缓冲了来自XBoard的初始命令。我现在这样连接浏览器:

ws = new WebSocket("ws://localhost:2023/", "base64");
ws.onclose = function(){console.log("close");};
ws.onmessage = function(evt){console.log(window.atob(evt.data));};
ws.onopen = function(){console.log("open");}

(在控制台的一行上执行)

它连接起来,我在XBoard中第一次移动为白色,这是浏览器控制台中的输出:

open
xboard
protover 2
[2 second delay]
[other commands]
time 30000
otim 30000
b2b3

一切都很好。现在我在浏览器中以黑色移动:ws.send(window.btoa("move b7b5n"));同样有效。

现在,当我在XBoard中进行游戏的第三步时,它已经不起作用了。鼠标悬停后立即显示此控制台输出:

  1: 127.0.0.1: Target closed
xboard: Error writing to first chess program: Broken pipe
xboard: Error writing to first chess program: Broken pipe
xboard: Error writing to first chess program: Broken pipe
xboard: Error: first chess program (nc -q -1 -k -l 2023) exited unexpectedly

GUI显示了相同的内容。

所以我的假设是,在第一次移动后,EOF会以某种方式从XBoard发送到netcat。这真的没有道理,因为为什么webstockify没有更早地报告"目标关闭"?是什么让第一步与XBoard发送的所有其他命令如此不同?

是!我找到了一个解决方案。

我将xboard"engine"命令更改为./runserver.sh,并将runserver.sh写为(执行标志集):

#!/bin/sh
nc -q -1 -k -l 2023 | tee /dev/null

现在一切正常!

相关内容

  • 没有找到相关文章

最新更新