Tcp 如何删除EOF';这是从管子里来的吗?或者:如何在netcat中使用tail-f?

Tcp 如何删除EOF';这是从管子里来的吗?或者:如何在netcat中使用tail-f?,tcp,websocket,pipe,chess,netcat,Tcp,Websocket,Pipe,Chess,Netcat,我正在尝试通过TCP传输XBoard chess命令。我知道当看到EOF时,nc将关闭连接 例1 这就是我的问题,我只是认为我需要找出如何使上面的nc-l命令不会终止。我已经读到我可以使用tail-f,但除非我使用文件或FIFO,否则这似乎不起作用。下面是一个类似问题(我认为)的解释,它促使我寻找解决这个问题的方法: 例2 我想在浏览器中运行XBoard象棋引擎,并通过WebSocket进行通信。因此,我启动XBoard的方式如下: ./websockify 2023 -- xboard -fc

我正在尝试通过TCP传输XBoard chess命令。我知道当看到EOF时,
nc
将关闭连接

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

例2 我想在浏览器中运行XBoard象棋引擎,并通过WebSocket进行通信。因此,我启动XBoard的方式如下:

./websockify 2023 -- xboard -fcp "nc -q -1 -k -l 2023"
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");}
它启动后,websockify似乎会缓冲来自XBoard的初始命令。我现在按如下方式连接浏览器:

./websockify 2023 -- xboard -fcp "nc -q -1 -k -l 2023"
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 b7b5\n”)
也行

现在,当我在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
图形用户界面显示了相同的结果


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

是的!我找到了解决办法

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


现在一切都好了

请注意,DOS和Windows将愉快地将^Z视为
EOF
字符,但Unix派生系统没有
EOF
字符。(在终端上键入
^D
要求终端关闭管道,但这是正在使用的终端的一项功能。)幕后的机制是管道实际上已关闭。@sarnold但接收netcat如何知道EOF何时关闭?终端无法识别,因为它甚至没有接收到来自终端的输入。我让netcat监听多个连接(
-k
)并永远等待(
-q-1
),太好了!那应该会赢得某种聪明奖。