Quando um servidor Windows envia UDP para um cliente que já saiu, volta um aviso de “porta inexistente” (ICMP). Esse aviso faz a próxima chamada de recepção terminar com erro, e, se o código do servidor tratar esse erro como falha do próprio socket, todos que usam aquele socket são afetados.
Por quê O servidor continua enviando UDP para o endereço de um cliente que acabou de sair, e volta o aviso de “porta inexistente” (ICMP) → Efeito O Windows encerra a chamada de recepção seguinte com o erro WSAECONNRESET (10054), e o código do servidor para de receber ou fecha o socket → Na tela Todos que usavam aquele socket têm travamento ou desconexão ao mesmo tempo
Aleatoriamente, de vez em quando, Logo após login ou manutenção
Responsável
Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento)
O que fazer (Equipe de desenvolvimento)
Desligar o SIO_UDP_CONNRESET com WSAIoctl para não receber esse aviso, em caso de erro de recepção só registrar no log e continuar recebendo.
No gráfico
Queda de conexões em massa · Conexões, logs de erro de recepção
Onde olhar
Procurar no log do servidor do jogo o código de erro de recepção UDP (WSAECONNRESET, 10054) e registros de parada do loop de recepção ou de fechamento do socket, e ver numa captura de pacotes do lado do servidor se chegou um ICMP Port Unreachable logo antes
Confirma se
Logo antes da desconexão em massa há um erro de recepção WSAECONNRESET registrado e, antes dele, chegou um ICMP Port Unreachable do endereço de um cliente que acabara de sair
Descarta se
Servidor Linux, ou código que já desliga o SIO_UDP_CONNRESET: não se aplica
Como verificar
Exige logs e métricas do servidor ou do cliente do jogo
Fontes
Winsock IOCTLsMicrosoft SIO_UDP_CONNRESET liga e desliga a notificação de “porta inexistente” (PORT_UNREACHABLE) no UDP
recvfrom function (winsock.h)Microsoft Num socket UDP, WSAECONNRESET significa que um envio anterior recebeu ICMP Port Unreachable