cat file para udp, pt 2: enviar 1 pacote udp por ^ linha delimitada por C

3

Ontem eu perguntei a uma pergunta sobre a criação de um arquivo em um soquete UDP no bash.

A solução que surgiu foi netcat -c -w 1 -v -u -s 127.0.0.1 239.255.0.1 30001 < test.txt . Isso funcionou no sentido de que enviou os pacotes, mas há um problema.

O arquivo de origem não é estritamente um arquivo de texto. Na verdade, é um arquivo binário - o conteúdo é principalmente texto, com caracteres não imprimíveis incorporados e sem \n lineendings. Em vez disso, o caractere de controle ^C (0x03) é usado como um delimitador de linha.

Quando netcat estava enviando pacotes, ele enviava o máximo possível em um único quadro UDP. Mas quero que ele envie um quadro UDP por ^C -dimimited mesasge no arquivo de origem.

Por exemplo, se meu arquivo consistir em:

foo^Cbar^Cbaz^C

usando netcat resultaria em um quadro UDP sendo enviado. O que eu quero é enviar 3 mensagens:

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

Existe uma maneira de realizar isso?

Eu tentei várias soluções possíveis, mas nada funcionou.

Por exemplo, tentei sed ding o arquivo de origem para substituir o ^C por ^C\n , mas isso não teve efeito:

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

Eu também tentei catalogar os arquivos para /dev/udp/ em vez de usar netcat , mas os resultados foram semelhantes.

foo^Cbar^Cbaz^C

Por fim, tentei usar awk para imprimir uma linha por vez e redirecioná-la para /dev/udp , mas os resultados foram realmente os mesmos.

Parece que ambos netcat e cat > /dev/udp armazenam a entrada em buffer até que ela tenha um quadro completo e, em seguida, enviem o quadro. Não é isso que eu quero.

Posso descarregar o buffer do udp ou, de alguma outra forma, enviar uma mensagem UDP por mensagem delimitada por C no arquivo de origem?

    
por John Dibling 31.01.2014 / 16:52

1 resposta

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

deve funcionar enquanto não houver mais de 8k entre dois ^ Cs.

Isso executa um comando socat por registro (registros sendo delimitados por ^ C através da variável separador de registro), com o registro mais o terminador de registro alimentado para socat via um pipe.

socat lê 8192 bytes por vez, então é tão grande quanto um pacote envia.

gawk grava no pipe como um registro completo por gravação (2).

Usando gawk em vez de awk aqui para garantir que os bytes NUL sejam manipulados corretamente.

    
por 31.01.2014 / 17:09