한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Guia do Lag em Jogos › Problemas que só afetam alguns

Conflito de porta UDP fixa Two clients bound to the same local UDP port

ID da causa pt-port-collision · Responsável principal Desenvolvimento do cliente (Equipe de desenvolvimento) · Também envolvidos Desenvolvimento do servidor (Equipe de desenvolvimento)

Abrir o card interativo, com figuras e simulações →

Se o cliente foi feito para usar uma porta local fixa, o segundo cliente no mesmo PC não consegue usar a porta ou divide os pacotes com o primeiro.

Por quê Os dois clientes tentam abrir a mesma porta UDP local (compartilhada à força com a opção de reutilização) → Efeito O SO entrega os pacotes que chegam a só um dos sockets, ou não garante qual deles recebe. O roteador e o servidor também veem os dois clientes como o mesmo endereço → Na tela Um dos lados não recebe os pacotes do mundo, e NPCs e outros jogadores ficam invisíveis ou a conexão cai

Sintomas
Invisível / entidade fantasma, Desconexão, Não conecta / loading infinito
Fatores
Perda de pacotes
Quem é afetado
Só um dos clientes no mesmo PC
Quando
Logo após login ou manutenção, Sempre
Responsável
Responsável principal Desenvolvimento do cliente (Equipe de desenvolvimento) · Também envolvidos Desenvolvimento do servidor (Equipe de desenvolvimento)
O que fazer (Equipe de desenvolvimento)
Cliente: deixar o SO escolher a porta local automaticamente (bind na porta 0). Servidor: distinguir as conexões pelo token de sessão emitido para cada uma.
No gráfico
Alto só em alguns · Pacotes recebidos por cliente
Onde olhar
No PC do jogador, com os dois clientes abertos, ver no prompt de comando, com netstat -ano -p udp, a porta UDP local aberta por cada processo do jogo (PID). No servidor, verificar se as duas sessões chegam com o mesmo IP público e a mesma porta
Confirma se
Os dois processos do jogo estão vinculados à mesma porta local, ou as duas sessões aparecem no servidor com o mesmo IP e porta. Com um só cliente aberto, tudo normal
Descarta se
Os dois clientes usam portas locais diferentes e mesmo assim um deles tem problema: aponta para “Bug na separação de sessões por IP ou dispositivo” ou “Restrição a múltiplos clientes”
Como verificar
Verificação no ambiente do jogador

Fontes

  1. Using SO_REUSEADDR and SO_EXCLUSIVEADDRUSE Microsoft
    Um segundo bind na mesma porta com SO_REUSEADDR sequestra a porta, e não dá para saber qual socket vai receber os pacotes
  2. bind function (winsock.h) Microsoft
    Fazer bind na porta 0 atribui uma porta única da faixa de portas dinâmicas (49152–65535)
  3. netstat Microsoft
    -a mostra portas TCP e UDP, -n endereços numéricos, -o o ID do processo (PID), e -p udp mostra só UDP

Veja também

Mesma camada: Problemas que só afetam alguns

Mesmo sintoma (Invisível / entidade fantasma) em outras camadas

Ver o card interativo, com figuras e simulações