Incluso los juegos que son 100% cliente / servidor a veces tienen problemas cuando el cliente está detrás de NAT. Los juegos peee-peer son problemas aún mayores. Algunos juegos necesitan usar múltiples transportes (como UDP y TCP) o múltiples conexiones (como un puerto UDP diferente para voz).
¿Cuáles son algunas formas de asegurarse de que un juego funcione de manera confiable cuando se ejecuta detrás de un enrutador NAT?
- Peer-Peer: no existe un servidor centralizado. El jugador A comienza un juego y el jugador B quiere unirse
- Cliente-servidor: un servidor centralizado en una dirección conocida (nombre de host) acepta todas las conexiones entrantes. Cada cliente solo se comunica con ese servidor.
- Combo: donde el servidor solo es emparejamiento, pero las actualizaciones del juego son de igual a igual. Diferentes pares pueden ver cada jugador con una IP / puerto diferente potencialmente (por ejemplo, algunos clientes están detrás del mismo NAT y otros están en un enrutador diferente)
fuente
No haga que un cliente informe al servidor o al igual de su propia dirección. En otras palabras, no incruste la IP del cliente A en un paquete de juego y haga que el cliente B o el servidor respondan a esa dirección. Siempre responda a la dirección / puerto desde donde se originó el mensaje.
Minimice los diferentes puertos UDP o TCP utilizados para el juego. Esto facilita la configuración de las reglas NAT.
Permitir al usuario anular el puerto predeterminado utilizado en el juego. De esta manera, se pueden alojar varios servidores detrás del mismo NAT.
fuente
Junto con otras respuestas, use una rueda existente: http://miniupnp.free.fr/ Esta biblioteca combate casi todas las molestias en forma funcional, dándole control sobre cuándo y cómo golpear y tirar :)
fuente