2009-07-22 14 views
6

Sto realizzando un gioco di rete (1v1) in cui il gioco p2p non richiede un server di gioco.Giochi/app di rete P2P: buona scelta per un server di corrispondenza simile a "battle.net"

Tuttavia, affinché i giocatori possano "trovarsi l'un l'altro", senza la necessità di coordinarsi su un altro supporto e inserire indirizzi IP (simili ai giorni moderni dei giochi di rete), ho bisogno di un server di coordinamento/corrispondenza .

non posso usare normale web hosting perché:

  • I clienti potranno comunicare in UDP.
  • Quindi avrò bisogno di fare UDP Perforatura per essere in grado di passare attraverso il NAT
  • che richiederebbero il server di parlare in UDP e conoscere IP porta
  • afaik il cliente e con regolare di web hosting (php/etc) Posso solo ottenere l'indirizzo IP del client e posso comunicare solo in TCP (HTTP).

Opzioni Attualmente sto prendendo in considerazione:

  • Utilizzare una soluzione di hosting in cui il mio programma può accettare connessione UDP. (eventuali raccomandazioni?)

  • UDPonNAT sembra fare questo, ma utilizza GTalk e richiede ogni cliente di avere un conto GTalk per questo (che probabilmente lo rende una soluzione inadatta)

Tutte le idee? Grazie :)

risposta

3

In primo luogo, lasciatemi dire che questo è fuori dal mio ambito di competenza, ma mi sono trovato molto interessato, quindi ho fatto qualche ricerca e lettura.

Sembra che la soluzione più comunemente prescritta per l'attraversamento NAT UDP sia quella di utilizzare un server STUN. Ho fatto alcune ricerche rapide per vedere se ci sono aziende che ti offrono una soluzione di hosting STUN, ma se ce ne fossero, sono state sepolte in pile di annunci per un semplice web hosting.

Fortunatamente, sembra che ci siano diversi server STUN già operativi e gratuiti per l'uso pubblico. Esiste un elenco di server pubblici STUN allo voip-info.org.

Inoltre, se si esplora SO questions tagged "nat", sono disponibili molte più informazioni.

+0

@Joel Wietelmann: ho intenzione di provare questo. Ti farò sapere se funziona! Grazie :) – yairchu

3

Non vedo altra scelta che avere un server dedicato che esegue il codice. Le altre soluzioni che proponi sono, diciamo, meno ottimali.

Se si avvia in piccolo, l'hosting virtuale andrà bene. I costi sono piuttosto minimi.

+0

Ci sono altre scelte, ma tutte sono più di lavoro che ne vale la pena. Quando si tratta di netcode, è meglio mantenere le cose semplici. – Sneakyness

2

Piuttosto che un server dedicato completo, è possibile ottenere un servizio di hosting condiviso a basso costo e avere l'interfaccia dell'applicazione con una pagina PHP, che a sua volta si interfaccia con un backend del database MySQL.

Ad esempio, Lunarpages ha un pacchetto di avviamento $ 3/mese che include 5 GB di spazio e 50 GB di larghezza di banda. Per qualcosa di così semplice, è tutto ciò di cui hai bisogno.

Quindi basta che l'applicazione esegua il polling della pagina Web per l'elenco di giochi e invii una richiesta POST per aggiungere il proprio gioco all'elenco.

Naturalmente, questo metodo richiede l'apprendimento di PHP e MySQL se non li conosci già. E se lo fai bene, puoi fare in modo che la pagina PHP entri in una specie di loop infinito per mantenere la connessione aperta e solo per alimentare gli aggiornamenti al client, piuttosto che eseguire il polling della pagina ogni pochi secondi e sprecare molta banda. Questo è comunque fuori dallo scopo di questa risposta.

Oh, e se stai cercando qualcosa di assolutamente gratuito, cerca un host PHP gratuito. Anche quelli esistono! Anche con un host supportato dalla pubblicità, la tua app potrebbe semplicemente afferrare la pagina e ignorare gli annunci quando si analizza l'elenco dei giochi. So che T35 era uno dei miei preferiti perché il loro piano gratuito non tracciava spazio o larghezza di banda (limita la dimensione del file, per eliminare il loro servizio utilizzato come condivisione multimediale, ma non dovrebbe essere un problema per i file PHP).Ma naturalmente, penso che a lungo termine starai meglio con un host a pagamento.

Modifica: T35 dice anche "L'hosting gratuito consente di ospitare 1 dominio, mentre le offerte a pagamento offrono hosting di dominio illimitato." Così puoi anche solo pagare per un nome di dominio e collegarlo a loro! Penso che nel breve termine, questa sia la tua migliore (più economica) scommessa. Naturalmente, tutto ciò presuppone che tu sappia o sia disposto ad imparare PHP per far sì che ciò accada. :)

+0

@Ricket: grazie per il suggerimento.Ora ho scoperto che l'hosting di php non funzionerà per me perché non mi permetterà di comunicare con i clienti in UDP – yairchu

+1

. Sono appena tornato indietro e ho ri-calcolato il concetto di NAT traversal, e poi ho capito che sì hai bisogno delle funzionalità UDP. Però, per negoziare la lista di giochi e simili, dovresti usare TCP. È sufficiente che il server riceva i pacchetti UDP per determinare le porte in uscita dei client, quindi è possibile inviare loro un messaggio tramite TCP indicando ciascuna porta UDP in uscita. Ma spero tu sappia già tutto questo. Se hai bisogno di un aggiornamento, il podcast di Security Now è una risorsa fantastica: http://www.grc.com/securitynow.htm#42 – Ricket

+0

E solo FYI, PHP è tecnicamente in grado di trasmettere i socket; ma non sarebbe utile in questo caso, a causa della natura di PHP e del suo limite di esecuzione di 30 secondi. Puoi forse considerare Google App Engine? Penso che Python sarebbe un ottimo linguaggio per scrivere questo, per quanto lo disprezzi normalmente. – Ricket

0

Una soluzione intermedia tra l'hosting del proprio server dedicato e un ambiente di rete rigorosamente P2P è il modello gnutella. In quel modello, ci sono superpeer che si comportano come server locali, che hanno conosciuto indirizzi IP e sono connessi (e quindi conoscono) più client di un normale peer. Ciò richiede ancora di eseguire almeno un superpeer da solo, ma ti dà la possibilità di permettere ad altre persone di eseguire i propri superpeer.

+0

@Eric: Penso che in gnutella il server potrebbe fare molto più lavoro (cercare file condivisi, ecc.) E per il mio problema questo modello potrebbe essere eccessivo. – yairchu

+0

Hai ragione che sta facendo molto più lavoro. Stavo semplicemente suggerendo il modello in cui i client P2P formano una rete in cui sono a conoscenza di più coetanei rispetto a quelli a cui sono direttamente connessi. Questo è il modello di gnutella. – Eric

1

Non c'è niente che ogni connessione di rete supporterà. STUN è probabilmente buono, UPnP può funzionare per questo.

Tuttavia, si dice che la maggior parte dei firewall possa essere utilizzata per passare quasi tutto attraverso la porta UDP 53 (DNS). Tuttavia, potresti dover discutere con il sistema operativo del tuo accesso a quella porta.

Inoltre, controlla SIP, è un altro protocollo progettato per questo genere di cose. Con la popolarità di VOIP, ci può essere un supporto integrato decente per questo in più firewall.

Se si è veramente impegnati con UDP, si potrebbe anche considerare di eseguire il tunneling su HTTP.

1

che ne dici di suddividere il problema in due parti: crea un client di match matcher (che è distinto dal gioco), che può comunicare tramite http al tuo webhost economico/condiviso. Usa tutti i giocatori che vogliono usare la funzione di corrispondenza del gioco. Il client di game matcher avvia quindi il gioco effettivo con i parametri corretti (IP, ecc. Ecc.) Dopo aver ottenuto le informazioni dal tuo server.

Il gioco utilizzerà quindi il metodo standard per il punch UDP tramite NAT, ecc. Ecc., Come da codice di rete. Il gioco in realtà non ha bisogno di sapere nulla sul client matcher o sul server matcher - nel vero senso del p2p (come i torrent, una volta che è possibile ottenere gli IP del tuo pari, puoi persino disconnetterti dal tracker).

In questo modo, i problemi diventano più piccoli.

Problemi correlati