首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将消息分隔符添加到UDP流套接字管道中?

如何将消息分隔符添加到UDP流套接字管道中?
EN

Unix & Linux用户
提问于 2018-07-27 20:43:14
回答 2查看 2.3K关注 0票数 7

我使用socat拦截UDP消息并将它们发送到指定的管道:

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

我能够跟踪这个管道,看到它接收到的所有信息。

我想通过管道将tail -f /tmp/mypipe的输出传输到sed,以便对消息进行一些后处理,但不幸的是,其中有些消息并没有以换行符结尾。这是一个问题,因为它意味着多个不同的UDP消息可能位于同一行,而且如果未终止,tail -f /tmp/mypipe | sed ...也不会传递最后一行。

理想情况下,我希望能够在将消息分隔符发送到管道时添加一个自定义消息分隔符,这样我就可以轻松地找到消息边界。如果这是不可能的,那么有什么方法我可以遵循这个文件和管道的最后(可能是未终止的)行到另一个程序进行后处理?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2018-07-28 08:34:33

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

代码语言:javascript
运行
复制
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)之前输出一个以日期和长度作为>开头的标题。

代码语言:javascript
运行
复制
> 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
票数 3
EN

Unix & Linux用户

发布于 2019-12-30 14:18:13

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

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

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/458951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档