Cómo corregir el error 'Address already in use' (puerto en uso) en el servidor de MU Online
Aprende a identificar qué proceso está ocupando el puerto del ConnectServer o GameServer, cerrar ese proceso con seguridad y evitar que el error 'Address already in use' vuelva a bloquear el inicio de tu servidor de MU Online.
El error "Address already in use" (o, en algunas builds, "bind failed", "puerto ya está en uso") aparece cuando el ConnectServer, JoinServer o GameServer intenta abrir (bind) un puerto TCP que ya está ocupado por otro proceso — ya sea una instancia anterior del propio emulador que no se cerró bien,
El error "Address already in use" (o, en algunas builds, "bind failed", "puerto ya está en uso") aparece cuando el ConnectServer, JoinServer o GameServer intenta abrir (bind) un puerto TCP que ya está ocupado por otro proceso — ya sea una instancia anterior del propio emulador que no se cerró bien, o cualquier otro programa usando el mismo puerto por coincidencia. A diferencia de un error de configuración, este es un error de estado del sistema operativo, y la solución implica identificar y liberar el proceso que está reteniendo el puerto antes de intentar levantar el servidor de nuevo. Este tutorial muestra cómo diagnosticar, cerrar el proceso con seguridad y prevenir la recurrencia.
Por qué ocurre este error
Todo proceso que abre un puerto de red (bind) lo reserva exclusivamente para sí mismo mientras esté corriendo. Si el GameServer.exe de una sesión anterior se colgó, fue cerrado a la fuerza desde el Administrador de tareas, o la computadora se reinició sin un cierre limpio, es posible que el proceso antiguo siga "vivo" en segundo plano (o que el sistema operativo aún no haya liberado del todo el puerto, en estado TCP TIME_WAIT), impidiendo que la nueva instancia use el mismo puerto.
Síntomas y dónde aparecen
| Dónde aparece el error | Mensaje típico | Proceso afectado |
|---|---|---|
| Consola del GameServer al iniciar | "bind failed" / "Address already in use" | GameServer.exe |
| Consola del ConnectServer al iniciar | "Could not bind socket on port 44405" | ConnectServer.exe |
| Log de error de MySQL | "Port 3306 already in use" | mysqld.exe |
| Error genérico de Windows | "Only one usage of each socket address is normally permitted" | Cualquier servicio TCP |
Paso 1 — Identificar qué proceso está usando el puerto
En Windows, usa netstat combinado con findstr para localizar el PID (identificador del proceso) que ocupa el puerto en cuestión:
netstat -ano | findstr :44405
netstat -ano | findstr :55901
La última columna del resultado es el PID. Anótalo para el siguiente paso.
Paso 2 — Descubrir el nombre del proceso a partir del PID
Con el PID en mano, identifica a qué programa pertenece antes de cerrar cualquier cosa a ciegas:
Get-Process -Id <PID>
Esto evita el error clásico de cerrar un proceso del sistema o de otro programa que, por coincidencia, esté usando ese puerto.
Paso 3 — Cerrar el proceso antiguo con seguridad
Si el proceso identificado es efectivamente una instancia antigua del propio emulador (ej.: GameServer.exe colgado), ciérralo:
Stop-Process -Id <PID> -Force
Prefiere siempre confirmar el nombre del proceso (Paso 2) antes de usar -Force, especialmente en servidores compartidos con otros servicios.
Paso 4 — Esperar el TIME_WAIT de TCP, si aplica
Si netstat muestra el puerto en estado TIME_WAIT (y no LISTENING) y ningún proceso aparece asociado a él, el sistema operativo todavía está en el período de espera estándar del protocolo TCP tras el cierre de la conexión anterior (generalmente entre 30 segundos y 4 minutos, según la configuración de Windows). En ese caso, no hay proceso que matar — solo hay que esperar, o reiniciar el servicio de red.
netstat -ano | findstr TIME_WAIT
Paso 5 — Configurar reutilización de socket en el emulador (SO_REUSEADDR)
Emuladores más recientes (algunas builds de IGCN y MuEMU) permiten habilitar la reutilización inmediata de dirección/puerto en la configuración del servidor, evitando el problema de TIME_WAIT en reinicios frecuentes durante desarrollo y pruebas:
[Network]
ReuseAddress = 1
No todos los emuladores exponen esta opción — verifica la documentación de la build específica que uses.
Paso 6 — Separar puertos de entorno de prueba y producción
Un error común en equipos con más de un administrador es correr una segunda instancia del emulador (entorno de prueba/homologación) usando exactamente los mismos puertos que el entorno de producción en la misma máquina. Configura un conjunto de puertos dedicado para pruebas:
| Entorno | ConnectServer | GameServer |
|---|---|---|
| Producción | 44405 | 55901 |
| Prueba/Homologación | 44415 | 55911 |
Paso 7 — Adoptar un cierre limpio del servidor
Siempre que vayas a detener el servidor para mantenimiento, usa el comando de apagado del propio emulador (muchos tienen un comando de consola como shutdown o /quit) en vez de cerrar la ventana de la consola con la X o matar el proceso desde el Administrador de tareas. Un cierre limpio cierra los sockets correctamente y libera el puerto de inmediato, evitando el problema en el próximo inicio.
Paso 8 — Correr como servicio de Windows para mayor estabilidad
Para servidores de producción, considera correr el ConnectServer y el GameServer como servicios de Windows (usando una herramienta como NSSM — Non-Sucking Service Manager) en vez de ejecutables abiertos manualmente en ventanas de consola. Los servicios tienen un ciclo de vida más predecible y reducen la posibilidad de que queden procesos "fantasma" tras cortes de energía o reinicios inesperados.
Errores comunes y soluciones
| Síntoma | Causa probable | Solución |
|---|---|---|
| "Address already in use" al iniciar el GameServer | Instancia anterior todavía corriendo | Identifica el PID con netstat y cierra el proceso |
| Puerto aparece en TIME_WAIT sin proceso asociado | Espera estándar del protocolo TCP | Espera el tiempo estándar o habilita la reutilización de socket |
| El error vuelve cada vez que el servidor se reinicia | El cierre siempre se hace de forma forzada | Usa el comando de apagado limpio del emulador |
| Dos entornos (prueba y producción) chocan | Se usa el mismo puerto en ambas instancias | Separa los puertos por entorno |
| MySQL no arranca con error de puerto | Ya hay otro servicio MySQL corriendo en el 3306 | Detén el servicio duplicado o cambia el puerto de uno de ellos |
| El error solo ocurre después de un corte de energía | Procesos no finalizados correctamente | Migra a correr como servicio de Windows (NSSM) |
Lista de verificación de resolución
- PID que ocupa el puerto identificado vía netstat.
- Nombre del proceso confirmado antes de cerrarlo.
- Proceso antiguo cerrado o TIME_WAIT esperado.
- Reutilización de socket habilitada en la configuración, si está disponible.
- Puertos de prueba y producción separados.
- Cierre del servidor realizado siempre mediante el comando de apagado limpio.
- Servicios críticos (GameServer/ConnectServer) migrados a correr como servicio de Windows, si están en producción.
Después de eliminar los conflictos de puerto, revisa también las reglas de firewall asociadas a cada puerto liberado, ya que ambos problemas suelen aparecer juntos en migraciones de servidor — mira el tutorial de creación de servidor de MU Online para una visión completa de la infraestructura recomendada.
Preguntas frecuentes
¿Por qué este error aparece de la nada, si ayer el servidor arrancó normalmente?
Generalmente porque una instancia anterior del GameServer o ConnectServer no se cerró correctamente (caída, corte de energía, cierre forzado de la ventana) y quedó un proceso 'fantasma' aún reteniendo el puerto en memoria, incluso sin responder a nada.
¿Puedo simplemente cambiar el puerto del servidor en vez de cerrar el proceso antiguo?
Puedes, y a veces es la solución más rápida en producción, pero eso solo esconde el síntoma. Si el proceso fantasma sigue corriendo, va a consumir memoria y puede causar comportamiento inconsistente en la base de datos (conexiones duplicadas). Lo ideal es siempre identificar y cerrar el proceso, no solo cambiar de puerto.
¿El TIME_WAIT de TCP puede causar este error incluso sin ningún proceso corriendo?
Sí. Después de que una conexión TCP se cierra, el sistema operativo mantiene el puerto en estado TIME_WAIT durante un tiempo (generalmente entre 30 y 240 segundos) antes de liberarlo por completo. Si intentas reiniciar el servidor inmediatamente después de un cierre, puedes ver este error incluso sin ningún proceso activo — la solución es esperar o configurar reutilización de socket (SO_REUSEADDR) en el emulador.
¿Cómo evito que esto pase cada vez que reinicio el servidor?
Usa siempre un cierre limpio del servicio (el comando de apagado del propio emulador o detener el servicio de Windows, si corre como servicio) en vez de cerrar la ventana de la consola o matar el proceso desde el Administrador de tareas a la fuerza. Un cierre limpio libera el puerto de inmediato.
¿Este error puede ser causado por dos servidores diferentes intentando usar el mismo puerto?
Sí, es común cuando el administrador corre pruebas en una segunda instancia del emulador (entorno de pruebas) usando la misma configuración de puerto que el entorno de producción. Usa siempre puertos diferentes para instancias de prueba y de producción.