Использование netcat с FIFO - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь получить диагностические данные с устройства, к которому я подключаюсь по сети.Он предлагает хороший жесткий протокол, где вы отправляете запрос из 3 или 4 символов и получаете ответ <~ 30 символов.Что нужно учитывать: </p>

  1. Вы должны ждать 20 мс между запросами (я хочу опрашивать как можно быстрее)
  2. Вы должны дождаться ответа перед отправкой следующего запроса
  3. Хотя запрос должен заканчиваться концом строки Unix, ответы идут с концом строки Mac (я знаю)

Я пытаюсь сделать это с помощью netcat.Основные операции просты:

$ echo STA | netcat <IP> <Port>
123498754

Запрос STA даст вам слово состояния, которое netcat записывает в стандартный вывод.Я также могу сделать это

$ cat | netcat <IP> <Port>
STA          # <- typed input
12345678     # written by netcat
STA          # <- typed input
12345678     # written by netcat

Здесь я вижу, что первый запрос занимает значительно больше времени: несколько секунд без заметной задержки.Я хочу избавиться от задержки.И вот мой квест начинается: Держите netcat открытым !

Я не могу просто передать файл в netcat, потому что мне нужно ждать ответов.Поэтому я пытаюсь сделать это с помощью FIFO.Я создал два (/ d / pc2dev и / d / dev2pc), оба с разрешением rw.Я мог бы написать сценарий, основанный на этом, если бы я мог заставить работать основы.Это работает

#### SHELL 1 #############################
$ tail -f /d/pc2dev | netcat <IP> <Port> | tr '\r' '\n'
12345678654   # written by netcat with delay
12345678654   # written by netcat as soon as I send the request on shell 2
12345678654   # ditto
#### SHELL 2 #############################
$ echo STA > /d/pc2dev
$ echo STA > /d/pc2dev
$ echo STA > /d/pc2dev

(без tr ответы будут записываться поверх друг друга.) Однако это не так:

#### SHELL 1 #############################
$ tail -f /d/pc2dev | netcat <IP> <Port> | tr '\r' '\n' > /d/dev2pc
#### SHELL 2 #############################
$ echo STA > /d/pc2dev
$ echo STA > /d/pc2dev
#### SHELL 3 #############################
$ cat /d/dev2pc
# expecting output here - none comes!

Запись в обычный файл также не работает:

#### SHELL 1 #############################
$ tail -f /d/pc2dev | netcat <IP> <Port> | tr '\r' '\n' > log.txt
#### SHELL 2 #############################
$ echo STA > /d/pc2dev
$ echo STA > /d/pc2dev
$ cat log.txt
# nothing

Кажется, что операция записи в FIFO / файл где-то буферизуется, а запись в стандартный вывод выполняется немедленно.(Тем не менее, даже при ctrl + c'ing netcat и др. Этот гипотетический буферизованный вывод не записывается.)

Так или иначе - как я могу заставить это работать?

1 Ответ

0 голосов
/ 05 февраля 2019

попробуйте подключиться к tee вместо перенаправления вывода, man 1 tee, посмотрите, что произойдет.

Следующее сработало

$ tail -f /d/pc2dev | stdbuf -i0 -o0 netcat <IP> <Port> | stdbuf -i0 -o0 tr '\r' '\n' > /d/dev2pc

...