2009-07-22 12 views
6

Estoy haciendo un juego de red (1v1) en el que el juego es p2p, sin necesidad de un servidor de juego.Juegos/aplicaciones de red P2P: Buena opción para un servidor compatible con "battle.net"

Sin embargo, para que los jugadores puedan "encontrar el uno al otro", sin necesidad de coordinar en otro medio e ingresar direcciones IP (similar a los días modernos de juegos en red), necesito tener un servidor de coordinación/coincidencia .

no puedo usar web normal de alojamiento debido a que:

  • Los clientes van a comunicarse en UDP.
  • Por lo tanto voy a tener que hacer UDP Perforación para poder pasar por el NAT
  • que requeriría el servidor para hablar en UDP y saber que aloja el IP del cliente, y el puerto
  • que yo sepa con web normal (php/etc) Solo puedo obtener la dirección IP del cliente y solo puedo comunicarme en TCP (HTTP).

Opciones actualmente estoy considerando:

  • Use una solución de hosting donde mi programa puede aceptar la conexión UDP. (ninguna recomendación?)

  • UDPonNAT parece hacer esto, pero utiliza GTalk y requiere que cada cliente tenga una cuenta de GTalk para esto (lo que probablemente hace que sea una solución inadecuada)

¿Alguna idea? Gracias :)

Respuesta

3

Primero, permítanme decir que esto está fuera de mi dominio de la experiencia, pero me encontré muy interesado, así que he estado buscando y leyendo.

Parece que la solución prescrita más comúnmente para el cruce de UDP NAT es usar un servidor STUN. Hice algunas búsquedas rápidas para ver si hay empresas que le proporcionen directamente una solución de alojamiento STUN, pero si había alguna, estaban enterradas en montones de anuncios de alojamiento web simple.

Afortunadamente, parece que hay varios servidores STUN que ya están en funcionamiento y son gratuitos para uso público. Hay una lista de servidores STUN públicos en voip-info.org.

Además, hay mucha más información si se explora SO questions tagged "nat".

+0

@Joel Wietelmann: Voy a intentar esto. ¡Te dejaré saber si funciona! Gracias :) – yairchu

3

No veo otra opción que tener un servidor dedicado ejecutando su código. Las otras soluciones que propone son, digamos, menos que óptimas.

Si comienza pequeño, el alojamiento virtual estará bien. Los costos son bastante mínimos.

+0

Hay otras opciones, pero todas ellas son más trabajos de lo que vale la pena. Cuando se trata de netcode, es mejor mantener las cosas simples. – Sneakyness

2

En lugar de un servidor dedicado completo, puede obtener un servicio de alojamiento compartido barato y tener la interfaz de la aplicación con una página PHP, que a su vez se conecta con un back-end de base de datos MySQL.

Por ejemplo, Lunarpages tiene un paquete de inicio de $ 3/mes que incluye 5gb de espacio y 50gb de ancho de banda. Para algo tan simple, eso es todo lo que necesitas.

Luego, solo tiene su encuesta de aplicación en la página web para la lista de juegos y envía una solicitud POST para agregar su propio juego a la lista.

Por supuesto, este método requiere aprender PHP y MySQL si aún no los conoce. Y si lo haces bien, puedes hacer que la página PHP ingrese una especie de bucle infinito para mantener la conexión abierta y simplemente alimentar actualizaciones para el cliente, en lugar de sondear la página cada pocos segundos y perder mucho ancho de banda. Sin embargo, eso está fuera del alcance de esta respuesta.

Ah, y si estás buscando algo totalmente gratis, busca un host PHP gratuito. ¡Esos también existen! Incluso con un host con publicidad, su aplicación podría simplemente tomar la página e ignorar los anuncios cuando analiza la lista de juegos. Sé que T35 solía ser uno de mis favoritos porque su plan gratuito no rastrea el espacio o el ancho de banda (limita el tamaño por archivo, para eliminar el uso de su servicio como medio compartido, pero no debería ser un problema para archivos PHP).Pero, por supuesto, creo que a largo plazo será mejor que vayas con un servidor pago.

Editar: T35 también dice "El alojamiento gratuito permite hospedar 1 dominio, mientras que el pago ofrece alojamiento de dominio ilimitado". ¡Así que puedes pagar un nombre de dominio y vincularlo! Creo que en el corto plazo, esa es tu mejor (más barata) apuesta. Por supuesto, todo esto supone que usted sabe o está dispuesto a aprender PHP para que esto suceda. :)

+0

@Ricket: gracias por la sugerencia.Ahora descubrí que php hosting no funcionará para mí porque afaik no me permitirá comunicarme con los clientes en UDP – yairchu

+1

Right. Acabo de regresar y redefinir el concepto de NAT transversal, y luego me di cuenta de que sí necesitaría las capacidades de UDP. Sin embargo, para negociar la lista de juegos, debe usar TCP. Solo necesita que el servidor reciba los paquetes UDP para determinar los puertos de salida de los clientes, y luego puede enviarles un mensaje a través de TCP que indique el puerto UDP saliente de cada uno. Pero espero que ya sepas todo esto. Si necesita una actualización, el podcast de Security Now es un recurso increíble: http://www.grc.com/securitynow.htm#42 – Ricket

+0

Y solo FYI, PHP es técnicamente capaz de realizar transmisiones de socket; pero no sería útil en este caso, debido a la naturaleza de PHP y su límite de ejecución de 30 segundos. ¿Quizás pueda considerar Google App Engine? Creo que Python sería un excelente lenguaje para escribir esto, por mucho que lo desprecie. – Ricket

0

Una solución intermedia entre alojar su propio servidor dedicado y un entorno de red estrictamente P2P es el modelo de gnutella. En ese modelo, hay superpeers que actúan como servidores locales, que tienen direcciones IP conocidas y se conectan (y por lo tanto tienen conocimiento de) más clientes que un par típico. Esto todavía requiere que ejecutes al menos un superpeer, pero te da la opción de permitir que otras personas ejecuten sus propios superpeers.

+0

@Eric: Creo que en gnutella el servidor podría estar haciendo mucho más trabajo (buscar archivos compartidos, etc.) y para mi problema este modelo podría ser excesivo. – yairchu

+0

Tienes razón en que está haciendo mucho más trabajo. Simplemente estaba sugiriendo el modelo en el que los clientes P2P forman una red en la que están conscientes de más pares que solo aquellos a los que están conectados directamente. Este es el modelo de Gnutella. – Eric

1

No hay nada que admita cada conexión de red. STUN es probablemente bueno, UPnP puede funcionar para esto.

Sin embargo, se rumorea que la mayoría de los firewalls pueden ser atraídos para pasar casi cualquier cosa a través del puerto UDP 53 (DNS). Sin embargo, es posible que tenga que discutir con el sistema operativo sobre su acceso a ese puerto.

Además, mira SIP, es otro protocolo diseñado para este tipo de cosas. Con la popularidad de VOIP, puede haber un soporte integrado decente para esto en más firewalls.

Si realmente está comprometido con UDP, también puede considerar tunelizarlo a través de HTTP.

1

¿qué tal si se divide el problema en dos partes? Haga un cliente del juego matcher (que es distinto del juego), que puede comunicarse a través de http a su servidor de Internet barato/compartido. Todos los jugadores que quieran usar la función de emparejar juegos usan esto. Luego, el cliente del juego matcher inicia el juego real con los parámetros correctos (IP, etc.) después de obtener la información de su servidor.

El juego usará la forma estándar para el punteo de UDP a través de NAT, etc., según su código de red. El juego en realidad no necesita saber nada sobre el cliente de Matcher o el servidor de Matcher, en el verdadero sentido de p2p (como torrents, una vez que puedes obtener las IP de tus compañeros, incluso puedes desconectarte del rastreador).

De esta manera, sus problemas se hacen más pequeños.

Cuestiones relacionadas