Como corrigir o erro 'Address already in use' (porta em uso) no servidor de MU Online
Aprenda a identificar qual processo está ocupando a porta do ConnectServer ou GameServer, encerrar esse processo com segurança e evitar que o erro 'Address already in use' volte a travar a inicialização do seu servidor de MU Online.
O erro "Address already in use" (ou, em algumas builds, "bind failed", "porta já está em uso") aparece quando o ConnectServer, JoinServer ou GameServer tenta abrir (bind) uma porta TCP que já está sendo ocupada por outro processo — seja uma instância anterior do próprio emulador que não fechou direi
O erro "Address already in use" (ou, em algumas builds, "bind failed", "porta já está em uso") aparece quando o ConnectServer, JoinServer ou GameServer tenta abrir (bind) uma porta TCP que já está sendo ocupada por outro processo — seja uma instância anterior do próprio emulador que não fechou direito, seja outro programa qualquer usando a mesma porta por coincidência. Diferente de um erro de configuração, esse é um erro de estado do sistema operacional, e a solução envolve identificar e liberar o processo que está segurando a porta antes de tentar subir o servidor novamente. Este tutorial mostra como diagnosticar, encerrar o processo com segurança e prevenir a recorrência.
Por que esse erro acontece
Todo processo que abre uma porta de rede (bind) reserva aquela porta exclusivamente para si enquanto estiver rodando. Se o GameServer.exe de uma sessão anterior travou, foi fechado à força pelo Gerenciador de Tarefas, ou o computador reiniciou sem um encerramento limpo, é possível que o processo antigo continue "vivo" em segundo plano (ou que o sistema operacional ainda não tenha liberado totalmente a porta, no estado TCP TIME_WAIT), impedindo a nova instância de usar a mesma porta.
Sintomas e onde aparecem
| Onde aparece o erro | Mensagem típica | Processo afetado |
|---|---|---|
| Console do GameServer ao iniciar | "bind failed" / "Address already in use" | GameServer.exe |
| Console do ConnectServer ao iniciar | "Could not bind socket on port 44405" | ConnectServer.exe |
| Log de erro do MySQL | "Port 3306 already in use" | mysqld.exe |
| Erro genérico do Windows | "Only one usage of each socket address is normally permitted" | Qualquer serviço TCP |
Passo 1 — Identificar qual processo está usando a porta
No Windows, use netstat combinado com findstr para localizar o PID (identificador do processo) que ocupa a porta em questão:
netstat -ano | findstr :44405
netstat -ano | findstr :55901
A última coluna do resultado é o PID. Anote-o para o próximo passo.
Passo 2 — Descobrir o nome do processo pelo PID
Com o PID em mãos, identifique a qual programa ele pertence antes de encerrar qualquer coisa às cegas:
Get-Process -Id <PID>
Isso evita o erro clássico de encerrar um processo do sistema ou de outro programa que, por coincidência, esteja usando aquela porta.
Passo 3 — Encerrar o processo antigo com segurança
Se o processo identificado for de fato uma instância antiga do próprio emulador (ex.: GameServer.exe travado), encerre-o:
Stop-Process -Id <PID> -Force
Prefira sempre confirmar o nome do processo (Passo 2) antes de usar -Force, especialmente em servidores compartilhados com outros serviços.
Passo 4 — Aguardar o TIME_WAIT do TCP, se aplicável
Se netstat mostrar a porta em estado TIME_WAIT (e não LISTENING) e nenhum processo aparecer associado a ela, o sistema operacional ainda está no período de espera padrão do protocolo TCP após o fechamento da conexão anterior (geralmente entre 30 segundos e 4 minutos, dependendo da configuração do Windows). Nesse caso, não há processo para matar — basta aguardar, ou reiniciar o serviço de rede.
netstat -ano | findstr TIME_WAIT
Passo 5 — Configurar reuso de socket no emulador (SO_REUSEADDR)
Emuladores mais recentes (algumas builds de IGCN e MuEMU) permitem habilitar reuso imediato de endereço/porta na configuração do servidor, evitando o problema de TIME_WAIT em reinicializações frequentes durante desenvolvimento e testes:
[Network]
ReuseAddress = 1
Nem todo emulador expõe essa opção — verifique a documentação da build específica que você usa.
Passo 6 — Separar portas de ambiente de teste e produção
Um erro comum em equipes com mais de um administrador é rodar uma segunda instância do emulador (ambiente de teste/homologação) usando exatamente as mesmas portas do ambiente de produção na mesma máquina. Configure um conjunto de portas dedicado para testes:
| Ambiente | ConnectServer | GameServer |
|---|---|---|
| Produção | 44405 | 55901 |
| Teste/Homologação | 44415 | 55911 |
Passo 7 — Adotar um encerramento limpo do servidor
Sempre que for parar o servidor para manutenção, use o comando de shutdown do próprio emulador (muitos têm um comando de console como shutdown ou /quit) em vez de fechar a janela do console no X ou matar o processo pelo Gerenciador de Tarefas. Um encerramento limpo fecha os sockets corretamente e libera a porta de forma imediata, evitando o problema na próxima inicialização.
Passo 8 — Rodar como serviço do Windows para maior estabilidade
Para servidores de produção, considere rodar o ConnectServer e o GameServer como serviços do Windows (usando uma ferramenta como NSSM — Non-Sucking Service Manager) em vez de executáveis abertos manualmente em janelas de console. Serviços têm ciclo de vida mais previsível e reduzem a chance de processos "fantasma" ficarem presos após quedas de energia ou reinicializações inesperadas.
Erros comuns e soluções
| Sintoma | Causa provável | Solução |
|---|---|---|
| "Address already in use" ao iniciar o GameServer | Instância anterior ainda rodando | Identifique o PID com netstat e encerre o processo |
| Porta aparece em TIME_WAIT sem processo associado | Espera padrão do protocolo TCP | Aguarde o tempo padrão ou habilite reuso de socket |
| Erro volta toda vez que o servidor reinicia | Encerramento sempre feito de forma forçada | Use o comando de shutdown limpo do emulador |
| Dois ambientes (teste e produção) conflitam | Mesma porta usada nas duas instâncias | Separe as portas por ambiente |
| MySQL não sobe com erro de porta | Outro serviço MySQL já rodando na 3306 | Pare o serviço duplicado ou mude a porta de um deles |
| Erro só depois de queda de energia | Processos não finalizados corretamente | Migre para rodar como serviço do Windows (NSSM) |
Checklist de resolução
- PID ocupando a porta identificado via netstat.
- Nome do processo confirmado antes de encerrar.
- Processo antigo encerrado ou TIME_WAIT aguardado.
- Reuso de socket habilitado na configuração, se disponível.
- Portas de teste e produção separadas.
- Encerramento do servidor sempre feito pelo comando de shutdown limpo.
- Serviços críticos (GameServer/ConnectServer) migrados para rodar como serviço do Windows, se em produção.
Depois de eliminar os conflitos de porta, revise também as regras de firewall associadas a cada porta liberada, já que os dois problemas costumam aparecer juntos em migrações de servidor — veja o tutorial de criação de servidor de MU Online para uma visão completa da infraestrutura recomendada.
Perguntas frequentes
Por que esse erro aparece do nada, se ontem o servidor subiu normalmente?
Geralmente porque uma instância anterior do GameServer ou ConnectServer não foi encerrada corretamente (crash, queda de energia, fechamento forçado da janela) e ficou um processo 'fantasma' ainda segurando a porta em memória, mesmo sem estar respondendo a nada.
Posso simplesmente mudar a porta do servidor em vez de encerrar o processo antigo?
Pode, e às vezes é a solução mais rápida em produção, mas isso só contorna o sintoma. Se o processo fantasma continuar rodando, ele vai consumir memória e pode causar comportamento inconsistente no banco de dados (conexões duplicadas). O ideal é sempre identificar e encerrar o processo, não só trocar de porta.
O TIME_WAIT do TCP pode causar esse erro mesmo sem processo nenhum rodando?
Sim. Depois que uma conexão TCP é fechada, o sistema operacional mantém a porta em estado TIME_WAIT por um tempo (geralmente 30 a 240 segundos) antes de liberá-la totalmente. Se você tentar religar o servidor imediatamente após um encerramento, pode ver esse erro até sem nenhum processo ativo — a solução é aguardar ou configurar reuso de socket (SO_REUSEADDR) no emulador.
Como evito que isso aconteça toda vez que eu reinicio o servidor?
Use sempre um encerramento limpo do serviço (comando de shutdown do próprio emulador ou parar o serviço do Windows, se estiver rodando como serviço) em vez de fechar a janela do console ou matar o processo via Gerenciador de Tarefas com força. Um shutdown limpo libera a porta imediatamente.
Esse erro pode ser causado por dois servidores diferentes tentando usar a mesma porta?
Sim, é comum quando o administrador roda testes em uma segunda instância do emulador (ambiente de teste) usando a mesma configuração de porta do ambiente de produção. Sempre use portas diferentes para instâncias de teste e produção.