Faça do netcat um “stream”

1

Então, estou fazendo uma experiência simples com netcat , onde você pode configurar uma chamada de voz. Aqui estão os comandos que estou usando.

servidor: arecord | netcat -l 10000 | aplay

cliente: arecord | netcat localhost 10000 | aplay

Meu problema aqui é que, quando o servidor é iniciado alguns segundos antes de o cliente se conectar, a voz é atrasada do servidor. Eu estou querendo saber como posso remover esse atraso. Tenho certeza que só preciso definir alguns valores em netcat , mas não tenho certeza de quais definir.

Eu usei UDP e TCP. Ambos não fazem diferença.

    
por SpecialBomb 09.08.2016 / 20:19

2 respostas

1

Eu suspeito que seus buffers de shell arecord output antes que netcat seja capaz de transmiti-lo (que é quando o cliente se conecta). Para confirmar, tente:

arecord | pv | netcat -l 10000 | aplay

No meu Ubuntu pv mostra que arecord produz pelo menos cerca de 60 KiB de saída (demora cerca de 8 segundos) mesmo se não houver conexão com netcat . Você pode suspeitar que este buffer é implementado por pv , mas não depende da opção pv -B , então eu acho que é o buffer do shell para o pipe.

Eu tentei com stdbuf e unbuffer (o último do pacote expect-dev no meu Ubuntu), mas os resultados foram insatisfatórios.

Eu obtive melhorias significativas quando usei dd para liberar dados suficientes no lado do cliente :

arecord | netcat localhost 10000 | { dd bs=100K count=1 iflag=fullblock of=/dev/null; aplay; }

No meu caso 100K foi suficiente; Sua millage pode variar. Note que você terá que esperar alguns segundos para que dd termine se você executar o comando muito cedo (antes que o buffer esteja cheio no lado do servidor) ou se o parâmetro bs=… for grande demais.

    
por 09.08.2016 / 22:43
0

Ao usar o TCP, a conexão é "garantida" para não perder dados. No seu caso, você provavelmente não quer isso, pois a única maneira de seu cliente e servidor evitar a perda de dados é enfileirar a entrega pendente.

Com dois sistemas, você pode alternar para o uso do UDP. Como isso é sem conexão, você não obtém os primeiros pacotes enfileirados, mas eles são descartados. Eu não posso testar isso no momento, mas eu sugiro que você tente isso:

Servidor no sistema 1

arecord | nc -u -l -p 10000 | aplay

Cliente no sistema 2

arecord | nc -u system1 10000 | aplay
    
por 09.08.2016 / 21:35