将 netcat 与 FIFO 结合使用

Using netcat with FIFOs

我正在尝试从我通过网络连接的设备获取诊断数据。它提供了一个很好的严格的专有协议,您可以在其中发送 3 或 4 个字符的请求并接收 <~30 个字符的响应。需要考虑的事项:

  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/file 的写入操作在某处进行了缓冲,而对 stdout 的写入是立即完成的。 (然而,即使在 ctrl+c'ing netcat 等上,这个假设的缓冲输出也不会被写入。)

无论是那样还是其他 - 我怎样才能让它工作?

尝试通过管道传输到 tee 而不是重定向输出 man 1 tee,看看会发生什么。

以下有效

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