file cat vers udp, pt 2: envoie 1 package udp par ligne délimité par C

Hier j'ai posé une question sur le catting d'un file sur une socket UDP dans bash.

La solution que nous avons trouvée était netcat -c -w 1 -v -u -s 127.0.0.1 239.255.0.1 30001 < test.txt . Cela a fonctionné dans le sens où il a envoyé les packages, mais il y a un problème.

Le file source n'est pas ssortingctement un file text. C'est en fait un file binary – le contenu est principalement du text, avec des caractères non imprimables embeddeds et pas de lignes de command. Au lieu de cela, le caractère de contrôle ^C (0x03) est utilisé comme délimiteur de ligne.

Lorsque netcat envoyait des packages, il envoyait autant que possible dans une seule trame UDP. Mais je veux qu'il envoie une trame UDP par ^C -delimited mesasge dans le file source.

Par exemple, si mon file est composé de:

 foo^Cbar^Cbaz^C 

l'utilisation de netcat entraînerait l'envoi d'une trame UDP. Ce que je veux, c'est envoyer 3 messages:

  1. foo^C
  2. bar^C
  3. baz^C

Y a-t-il un moyen d'y parvenir?


J'ai essayé un certain nombre de solutions possibles, mais rien n'a fonctionné.

Pour l'un j'ai essayé de sed le file source pour replace le ^C avec ^C\n , mais cela n'a eu aucun effet:

 sed 's/^C/^C\n\0/g' test.txt | netcat -n -vv -c -w 1 -v -u -s 127.0.0.1 239.255.0.2 30002 

J'ai aussi essayé catting les files à /dev/udp/ au lieu d'utiliser netcat , mais les résultats étaient similaires.

 cat test.txt > /dev/udp/239.255.0.2/30002 

Enfin, j'ai essayé d'utiliser awk pour imprimer une ligne à la fois et redirect vers /dev/udp , mais les résultats étaient vraiment les mêmes.

Il semble que netcat et cat > /dev/udp tamponnent tous deux l'input jusqu'à ce qu'il ait une image complète, puis en envoyant la trame. Ce n'est pas ce que je veux.

Puis-je vider le tampon udp, ou d'une autre façon envoyer un message UDP par ^ message délimité par C dans le file source?

 gawk -v 'RS=\03' -v cmd=' socat -u - udp-datagram:239.255.0.1:30001,bind=127.0.0.1' ' {print $0 RT| cmd; close(cmd)}' < file 

devrait fonctionner aussi longtime qu'il n'y a pas plus de 8k entre deux ^ Cs.

Cela exécute une command socat par logging (les loggings étant délimité par la variable séparateur d'loggings), l'logging et la terminaison d'logging étant envoyés à socat via un canal.

socat lit 8192 octets à la fois, donc c'est aussi grand qu'un package qu'il envoie peut get.

gawk écrit sur le tuyau comme un logging complet par écriture (2).

Utilisez gawk au lieu de awk ici pour vous assurer qu'il gère correctement les octets NUL.