如何将消息分隔符添加到 UDP 流 socat 正在管道中?

如何将消息分隔符添加到 UDP 流 socat 正在管道中?

我用来socat拦截 UDP 消息并将它们发送到命名管道:

socat UDP-LISTEN:9999,fork PIPE:/tmp/mypipe,append

我可以追踪这个管道并查看它收到的所有消息。

我想通过管道输出tail -f /tmp/mypipetosed来对消息进行一些后处理,但不幸的是其中一些消息不是换行符终止的。这是一个问题,因为它意味着多个不同的 UDP 消息可能位于同一行上,而且还因为tail -f /tmp/mypipe | sed ...如果最后一行未终止,则不会通过。

理想情况下,我希望能够在消息发送到我的管道时添加自定义消息分隔符,以便我可以轻松找到消息边界。如果这是不可能的,那么我是否可以通过某种方式跟踪该文件并将最后的(可能未终止的)行通过管道传输到另一个程序进行后处理?

答案1

不涉及分叉的一种可能性是使用socat详细输出而不是数据。我的版本socat -v包括详细输出中的数据长度,因此您知道它的结束位置。例如,

mkfifo mypipe
while sleep 3
do    printf "%sNONEWLINE" $RANDOM
done |
socat -u - UDP4:localhost:9999  &
socat -u -v UDP-RECV:9999 - >/dev/null 2>mypipe  &
cat -uv mypipe

将在每个数据项(例如)之前输出一个以日期和长度9430NONEWLINE开头的标题。>

> 2018/07/28 10:29:33.965222  length=13 from=0 to=12
9430NONEWLINE> 2018/07/28 10:29:36.968335  length=14 from=13 to=26
26947NONEWLINE> 2018/07/28 10:29:39.971025  length=14 from=27 to=40
15126NONEWLINE

答案2

使用sed,它可以用单个命令附加新行,以避免使用SYSTEM:"cat; echo \"\n\""输出时的竞争条件:

socat -u UDP-RECVFROM:9999,fork SYSTEM:"sed -e a\\\\"

相关内容