[FUG-BR] Interface de rede perdendo pacotes UDP

Otacílio otacilio.neto em bsd.com.br
Seg Maio 8 14:27:17 BRT 2017


Olá pessoal

Olhe só este cenário. Desenvolvi um software de streaming de vídeo em 
tempo real para uso próprio. O software hoje é capaz de transmitir o 
vídeo com os quadros codificados em H264, MPEG2, como sequencias de 
imagens MJPEG e em formato "raw" YUYV422. O software está usando UDP no 
canal de dados e TCP no de controle. Ele faz a quebra dos quadros em 
vários pacotes UDP e a remontagem e reordenação nos clientes. Acontece 
que venho percebendo que nas situações em que o fluxo de vídeo é alto 
(gerando então vários pacotes), como em resoluções altas ou quadros 
MJPEG e YUYV422 a interface de rede está perdendo os pacotes e 
obviamente eu preciso descartar os quadros incompletos no cliente. 
Entendi então que eu estava enviando os pacotes antes da interface 
mandar para a outra ponta e isto estaria forçando a interface a 
descartar os pacotes. Escrevi então esta rotina:

void waitSocketAvail(int socket)
{
     static int primeiro = 1;
     static fd_set writefds[FD_SETSIZE];
     int desP;

     if(primeiro==1){
         FD_ZERO(writefds);
         primeiro = 0;
     }

     for(;;){
         FD_SET(socket, writefds);
         desP = select(socket+1, NULL, writefds, NULL, NULL);
         if(desP>=0 || errno!=EINTR)
             break;
     }
     FD_CLR(socket, writefds);
}

Que bloqueia o processo até que o socket esteja pronto para receber mais 
pacotes. Acontece que embora tenha melhorado um pouco, a perda de 
pacotes ainda existe e do que vi na Internet o problema é que está 
enchendo os buffers do sistema antes dele poder enviar. A solução que vi 
sugerida é aumentar o tamanho do buffer do sistema.

Alguém já passou por experiência semelhante ou pode me dizer quais são 
os parâmetros que devo configurar?

[]'s

-Otacílio



Mais detalhes sobre a lista de discussão freebsd