Estou tentando adicionar funcionalidade de rede ao meu jogo. Quero que qualquer usuário possa hospedar o jogo e que qualquer pessoa possa se conectar como cliente. O cliente envia informações ao host sobre a posição do jogador etc. Quando o host recebe uma mensagem, ele a valida e a transmite para os outros clientes. Tratarei principalmente do UDP, mas também precisarei do TCP para conversar e fazer lobby.
O problema é que não consigo receber um pacote enviado do cliente para o host ou o contrário sem ativar o encaminhamento de porta no meu roteador. Mas não acho que isso seja necessário. Acredito que o motivo pelo qual preciso de encaminhamento de porta seja porque desejo enviar um pacote de 1 computador em uma LAN para outro computador em uma LAN diferente, mas nenhum deles tem um endereço IP global, pois está em uma LAN. Realmente, só posso enviar pacotes direcionados ao roteador da outra rede, que deve encaminhá-lo para a máquina que desejo acessar. Então, como posso fazer isso sem encaminhamento de porta? De alguma forma, um servidor Web pode se comunicar com meu computador, que não possui um IP global, sem encaminhamento de porta. E já joguei muitos jogos para vários jogadores que não exigem que eu ative o encaminhamento de porta. Então deve ser possível.
Btw, eu estou usando SDL_Net. Eu não acho que isso vai mudar nada.
fonte
Respostas:
Muitos NAT para um (muitos computadores com endereços privados atrás de um endereço público) funcionam assim: O roteador mantém o controle dos pacotes de saída e, quando uma resposta é recebida, pode enviá-lo ao computador interno que enviou a solicitação original. Portanto, isso funciona bem, se você visitar um site com um endereço IP público.
No entanto, não é possível enviar um pacote inicial de fora para um computador específico por dentro, a menos que uma regra de encaminhamento seja definida no roteador: Não há como endereçar um computador específico e o roteador não possui informações. sua tabela de conexão porque não é uma resposta.
O Skype tornou popular uma técnica chamada de perfuração de firewall : um servidor com um endereço público é contatado pelos clientes. Em seguida, ele envia uma resposta de volta ao cliente A, dizendo-lhe para enviar pacotes UDP ao roteador do cliente B em uma porta que espera que o roteador do cliente B use como porta de origem para o próximo pacote de saída. E diz ao cliente B para enviar um pacote ao roteador para o cliente A em uma porta que espera que o roteador A use como porta de origem para o próximo pacote de saída. Se a previsão estiver correta, A e B agora podem conversar diretamente entre si.
A perfuração do firewall requer que um servidor com um endereço IP público atue como moderador. E isso requer muito conhecimento sobre as implementações do roteador NAT comum para prever corretamente as portas de origem de saída. Embora haja implementações de código aberto disponíveis, tente evitar essa técnica, pois ela não é confiável e causa muita dor de cabeça. Skye volta a usar o servidor com o endereço IP público para retransmitir todos os pacotes se as previsões falharem.
fonte
É importante ressaltar que o próprio servidor da web possui um par global de IP / porta que o identifica exclusivamente. Seu computador se conecta ao servidor da web, que envia as informações de volta ao mesmo canal.
Essa técnica obviamente não está disponível se os dois lados estiverem por trás de algum tipo de NAT, como é o caso comum de jogos ponto a ponto. Então, em vez disso, você precisa enganar o NAT.
A técnica que você está procurando é chamada de perfuração ou perfuração , em particular perfuração UDP ou perfuração TCP . Nesse caso, os dois clientes se conectam a um servidor global, que, por sua vez, informa como se conectar, através do "furo" no firewall pela conexão existente.
A perfuração requer um servidor público com um IP / porta global para lidar com a conexão inicial e a transferência, mas os requisitos de largura de banda / processamento são mínimos. Se você tiver um servidor de lobby global, ele poderá lidar com isso facilmente.
fonte
O Google Talk usa libjingle para conseguir a mesma coisa.
Outras bibliotecas para ICE / STUN / TURN incluem PJNATH e libnice
fonte