Cuando un servidor Windows envía UDP a un cliente que ya se fue, vuelve un aviso de “puerto inalcanzable” (ICMP). Ese aviso hace que la siguiente llamada de recepción termine con error, y si el código del servidor lo trata como una avería del propio socket, todos los que usan ese socket se ven afectados.
Por qué Se sigue enviando UDP a la dirección de un cliente que acaba de irse y vuelve un aviso de “puerto inalcanzable” (ICMP) → Efecto Windows termina la siguiente llamada de recepción con el error WSAECONNRESET (10054), y el código del servidor deja de recibir o cierra el socket → En pantalla Congelamiento o desconexión simultánea de todos los que usaban ese socket
De vez en cuando, al azar, Al conectar o tras un mantenimiento
Responsable
Responsable principal Desarrollo de servidor (Equipo de desarrollo)
Tareas (Equipo de desarrollo)
Desactivar SIO_UDP_CONNRESET con WSAIoctl para no recibir este aviso, ante un error de recepción solo registrarlo en el log y seguir recibiendo.
En el gráfico
Desconexión masiva · Número de conexiones, log de errores de recepción
Dónde mirar
En los logs del servidor del juego, códigos de error de recepción UDP (WSAECONNRESET, 10054) y registros de que el bucle de recepción se detuvo o se cerró el socket; en una captura de paquetes en el servidor, si justo antes llegó un ICMP Port Unreachable
Se confirma si
Justo antes de la desconexión masiva se registra un error de recepción WSAECONNRESET y, antes de eso, llega un ICMP Port Unreachable desde la dirección de un cliente que acababa de irse
Se descarta si
No aplica si el servidor es Linux o si el código desactiva SIO_UDP_CONNRESET
Se verifica con
Requiere logs y métricas del servidor o el cliente del juego
Fuentes
Winsock IOCTLsMicrosoft SIO_UDP_CONNRESET activa y desactiva el aviso UDP de “puerto inalcanzable” (PORT_UNREACHABLE)
recvfrom function (winsock.h)Microsoft En un socket UDP, WSAECONNRESET significa que un envío anterior recibió un ICMP Port Unreachable