Como posso adicionar delimitadores de mensagens a um fluxo UDP?

5

Estou usando socat para interceptar mensagens UDP e enviá-las para um pipe nomeado:

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

Eu posso seguir esse pipe e ver todas as mensagens que recebe.

Gostaria de enviar a saída de tail -f /tmp/mypipe para sed para fazer algum pós-processamento das mensagens, mas infelizmente algumas delas não são terminadas em nova linha. Isso é um problema porque significa que várias mensagens UDP distintas podem estar na mesma linha e também porque tail -f /tmp/mypipe | sed ... não passa a última linha se ela não for terminada.

Idealmente, gostaria de poder adicionar um delimitador de mensagem personalizado à medida que eles são enviados para o meu canal, para que eu possa encontrar facilmente os limites da mensagem. Se isso não for possível, existe alguma maneira de seguir este arquivo e canalizar a linha final (potencialmente não terminada) para outro programa para pós-processamento?

    
por abc 27.07.2018 / 22:43

1 resposta

3

Uma possibilidade que não envolve a bifurcação é usar a saída socat verbose em vez dos dados. Minha versão de socat -v inclui o tamanho dos dados na saída detalhada, para que você saiba onde termina. Por exemplo,

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

produzirá antes de cada item de dados (por exemplo, 9430NONEWLINE ), um cabeçalho iniciando > com a data e um comprimento.

> 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
    
por 28.07.2018 / 10:34

Tags