我正在尝试通过TCP管道XBoard国际象棋命令。我了解nc
会在看到EOF时关闭连接。
$ 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,否则这似乎不起作用。现在这里是一个类似问题的解释(我认为),这使我找到了解决这个问题的方法:
我想在浏览器中运行XBoard Chess引擎并通过WebSockets进行通信。因此,我这样推出XBoard:
./websockify 2023 -- xboard -fcp "nc -q -1 -k -l 2023"
它启动并且websockify似乎缓冲了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 b7b5\n"));
也适用。
现在,当我在XBoard中进行游戏的第三步时,它不再起作用了。在mouseup之后立即出现此控制台输出:
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。这真的没有意义,因为没有websockify报告“目标关闭”更早?是什么让第一步与XBoard发送的所有其他命令如此不同?
答案 0 :(得分:3)
是的!我找到了解决方案。
我将xboard“engine”命令更改为./runserver.sh
并将runserver.sh
写为(执行标志设置):
#!/bin/sh
nc -q -1 -k -l 2023 | tee /dev/null
现在一切正常!