[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