Я пытаюсь передать шахматные команды XBoard через TCP. Я понимаю, что 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 в браузере и общаться через 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?