Colisión de puertos UDP fijos Two clients bound to the same local UDP port
ID de la causa pt-port-collision · Responsable principal Desarrollo de cliente (Equipo de desarrollo) · También Desarrollo de servidor (Equipo de desarrollo)
Si el cliente está hecho para usar un puerto local fijo, el segundo cliente de la misma computadora no puede usar ese puerto o se reparte los paquetes con el primero.
Por qué Los dos clientes intentan abrir el mismo puerto UDP local (compartido a la fuerza con una opción de reutilización) → Efecto El SO entrega los paquetes entrantes a uno solo de los sockets, o no garantiza cuál los recibe. El router y el servidor también ven a los dos clientes con la misma dirección → En pantalla Uno de ellos no recibe los paquetes del mundo: no ve los NPC ni a otros jugadores, o se desconecta
Responsable principal Desarrollo de cliente (Equipo de desarrollo) · También Desarrollo de servidor (Equipo de desarrollo)
Tareas (Equipo de desarrollo)
Cliente: dejar que el SO elija automáticamente el puerto local (bind al puerto 0). Servidor: distinguir las conexiones con un token de sesión emitido para cada una.
En el gráfico
Alto solo en algunos · Paquetes recibidos por cliente
Dónde mirar
En la computadora del jugador, con los dos clientes abiertos, ver en el Símbolo del sistema con netstat -ano -p udp el puerto UDP local que abrió cada proceso del juego (PID). En el lado del servidor, comprobar si las dos sesiones llegan con la misma IP pública y el mismo puerto
Se confirma si
Los dos procesos del juego están vinculados al mismo puerto local, o en el servidor las dos sesiones aparecen con la misma IP y el mismo puerto. Con un solo cliente abierto, todo va bien
Se descarta si
Si los dos clientes usan puertos locales distintos y aun así uno falla, apunta a “Bug de sesiones identificadas por IP o dispositivo” o a “Restricciones al multicliente”
Se verifica con
En el entorno del jugador
Fuentes
Using SO_REUSEADDR and SO_EXCLUSIVEADDRUSEMicrosoft Si se hace un segundo bind al mismo puerto con SO_REUSEADDR, el puerto queda secuestrado y no se sabe qué socket recibirá los paquetes
bind function (winsock.h)Microsoft Hacer bind al puerto 0 asigna un puerto único del rango de puertos dinámicos (49152–65535)
netstatMicrosoft -a muestra los puertos TCP y UDP, -n las direcciones en forma numérica, -o el ID de proceso (PID) y -p udp solo UDP