Как удалить EOF из труб?Или: Как использовать tail -f с netcat? - PullRequest
3 голосов
/ 31 марта 2012

Я пытаюсь передать шахматные команды 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?

1 Ответ

3 голосов
/ 31 марта 2012

Да! Я нашел решение.

Я изменил команду "engine" на xboard на ./runserver.sh и написал runserver.sh как (установить флаг выполнения):

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

Теперь все работает!

...