将netcat与FIFO结合使用

时间:2019-02-05 09:13:59

标签: bash fifo netcat

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

  1. 您必须在两次请求之间等待20毫秒(我想尽快轮询)
  2. 在发送下一个请求之前,您必须等待响应
  3. 虽然请求必须以Unix行结束,但响应随Mac行结束(我知道)

我正在尝试使用netcat进行此操作。基本操作很简单:

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

STA请求将为您提供一个状态字,netcat将该状态字写入stdout。我也可以做到

$ cat | netcat <IP> <Port>
STA          # <- typed input
12345678     # written by netcat
STA          # <- typed input
12345678     # written by 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 /文件的写操作被缓冲在某个地方,而对stdout的写操作则立即完成。 (但是,即使在ctrl + c'ing netcat等人身上,也不会写入此假设的缓冲输出。)

是那样还是那样-我怎样才能使它正常工作?

1 个答案:

答案 0 :(得分:1)

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

以下方法有效

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