将 netcat 与 FIFO 结合使用
Using netcat with FIFOs
我正在尝试从我通过网络连接的设备获取诊断数据。它提供了一个很好的严格的专有协议,您可以在其中发送 3 或 4 个字符的请求并接收 <~30 个字符的响应。需要考虑的事项:
- 请求之间必须等待 20 毫秒(我想尽快轮询)
- 您必须等待响应才能发送下一个请求
- 虽然请求必须以 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
我正在尝试从我通过网络连接的设备获取诊断数据。它提供了一个很好的严格的专有协议,您可以在其中发送 3 或 4 个字符的请求并接收 <~30 个字符的响应。需要考虑的事项:
- 请求之间必须等待 20 毫秒(我想尽快轮询)
- 您必须等待响应才能发送下一个请求
- 虽然请求必须以 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