Mesmo jogos 100% cliente / servidor às vezes apresentam problemas quando o cliente está atrás do NAT. Jogos peee-peer são problemas ainda maiores. Alguns jogos precisam usar vários transportes (como UDP e TCP) ou várias conexões (como uma porta UDP diferente para voz).
Quais são algumas maneiras de garantir que um jogo funcione de maneira confiável quando executado atrás de um roteador NAT?
- Ponto a ponto: não existe servidor centralizado. O jogador A inicia um jogo e o jogador B quer entrar
- Cliente-servidor: um servidor centralizado em um endereço conhecido (nome do host) aceita todas as conexões de entrada. Cada cliente se comunica apenas com esse servidor.
- Combinação: onde o servidor é apenas uma partida, mas as atualizações do jogo são ponto a ponto. Pares diferentes podem ver cada jogador com um IP / porta diferente potencialmente (por exemplo, alguns clientes estão atrás do mesmo NAT e outros em um roteador diferente)
fonte
Não faça com que um cliente informe o servidor ou o par de seu próprio endereço. Em outras palavras, não incorpore o IP do cliente A em um pacote de jogos e faça com que o cliente B ou o servidor responda a esse endereço. Sempre responda ao endereço / porta de onde a mensagem se originou.
Minimize as diferentes portas UDP ou TCP usadas para o jogo. Isso facilita a configuração das regras NAT.
Permitir que o usuário substitua a porta padrão usada no jogo. Dessa maneira, vários servidores podem ser hospedados atrás do mesmo NAT.
fonte
Juntamente com outras respostas, use uma roda existente: http://miniupnp.free.fr/ Esta biblioteca combate quase todos os aborrecimentos na forma de funções, oferecendo controle sobre quando e como perfurar e puxar :)
fonte