2012-04-18 2 views
13

Voglio connettere più dispositivi tramite socket senza alcuna implementazione del server. Lo userò solo per ottenere gli indirizzi IP dei dispositivi che registreranno.È possibile connettere due dispositivi ios usando i socket ottenendo il loro indirizzo IP?

+1

Forse il servizio Bonjour è quello che stai cercando? – user523234

+0

No, i dispositivi da collegare non si troveranno sulla stessa rete. Saranno connessi tramite le loro tre reti o la connessione gprs del provider di rete – AnishGupta

+3

Avrete bisogno di un meccanismo di scoperta. Se i dispositivi non si trovano sulla stessa rete, è necessario un qualche tipo di server. Se i dispositivi sono su 3G non puoi nemmeno essere sicuro che il loro IP sarà unico. – starbugs

risposta

4

È possibile utilizzare GameKit. Ha l'API matchmaking che può aiutarti.

Può essere utilizzato per app non di gioco.

+0

è una API di matchmaking che funziona su Internet? perché voglio un meccanismo di questo tipo che possa connettere i dispositivi multipli su Internet. Per mia conoscenza, Gamekit è in grado di connettere i dispositivi solo tramite bluetooth o rete locale. – freelancer

+0

Funziona anche su internet! – MacTeo

+3

Stai confondendo due cose. GKSession, la parte peer-to-peer di GameKit, funziona solo su bluetooth o rete locale. GKMatchmaker funziona su Internet, ma non è peer-to-peer: tutto viene instradato attraverso i server Apple o il tuo. Con un server personalizzato e un po 'di lavoro, può essere usato come parte di un introduttore per una vera rete P2P, ma da solo non arriva quasi a risolvere il problema. – abarnert

9

Ci sono due problemi principali per le comunicazioni peer-to-peer: scoperta e raggiungibilità.

Innanzitutto, è necessario conoscere l'indirizzo IP degli altri peer per connettersi ad essi. Una volta connessi a una rete di colleghi, tutti possono tenersi aggiornati sullo stato della rete, suggerendo colleghi migliori tra loro, passando per le notifiche di nuovi peer che si sono uniti e lasciati, ecc. Ma tu hai progettare e implementare un meccanismo per la negoziazione di tali informazioni. Ancora più importante, è necessario far ripartire le cose in qualche modo, perché quando un nuovo peer si avvia, è in una mesh di solo se stesso, e non ha informazioni da darsi.

Una possibilità è quella di avere una manciata di noti "superpeer" (che si eseguono) che sono sempre connessi e infornano i loro indirizzi nell'app. Oppure puoi avere "server di introduzione" al posto dei colleghi, con la stessa funzione. Oppure puoi avere un modo esterno per scambiare indirizzi (il più semplice è che gli utenti li scambino su un forum Web o su un canale IRC o di persona e li digiti manualmente), che può essere automatizzato in vari gradi. Ci sono anche scorciatoie che possono aiutare: Bonjour può ottenere altri peer sulla rete fintanto che un peer sulla LAN è già lì; GameCenter/GameKit può essere utilizzato come una rete di trading esterna automatizzata; ecc.

Dopo aver risolto il problema di individuazione, si ha ancora il problema di raggiungibilità. La maggior parte dei dispositivi iOS di solito non ha indirizzi IP accessibili pubblicamente; invece, sono dietro i router che eseguono la traduzione degli indirizzi di rete, che si tratti di un router WiFi domestico o della rete 3G di un operatore telefonico. Ciò significa che è necessario un modo per eseguire NAT Hole Punching per far dialogare due iPhone tra loro. Qualcuno che conosca sia l'indirizzo pubblico che l'indirizzo interno di ciascun dispositivo può organizzare la connessione tra loro. Puoi fare in modo che i peer normali facciano questo (anche se questo rende il problema di Jumpstart ancora più grande) o i tuoi superpeer/server di introduzione/ecc. fallo.

Se si desidera creare tutto questo da soli, probabilmente si desidera esaminare altre implementazioni. BitTorrent (compresi tracker e DHT) è ben compreso e documentato in un continuum di livelli che vanno da "bugie ai bambini" per curiosi utenti finali a specifiche dettagliate del protocollo e implementazioni open source. E poi guarda alcune altre reti P2P, perché BitTorrent non è perfetto, e non prova a fare tutto ciò che tutti hanno in mente.

+1

Consulta http://stackoverflow.com/questions/6421742/tcp-hole-punching-on-iphone per ulteriori informazioni sulla perforatura su iOS. Vedi http://www.rahul.net/dholmes/ctorrent/ per l'origine su Enhanced cTorrent, un client BitTorrent per iPhone. – abarnert

+1

C'è un ulteriore problema se si vogliono connessioni persistenti a lungo termine: gli iPhone cambiano gli indirizzi tutto il tempo. Quindi è necessario rilevarlo da una parte o dall'altra, ed eventualmente re-punzonare il buco per ristabilire la connessione. Ci sono alcuni protocolli P2P che tengono conto di ciò (credo che RTMFP di Adobe lo faccia, ma non so se i vecchi white paper che spiegavano come funzionava sono ancora disponibili), ma la maggior parte no, perché sono stati progettati per i sistemi desktop . – abarnert

0

Non è possibile. Se il dispositivo è tutto online con wifi, forse è possibile e si basa sull'impostazione del router, proprio come pc connect. Se alcuni dispositivi sono collegati con 3g o gprs protocal, potrebbero non avere alcun indirizzo IP.

+0

Non vero. GPRS e tutte le altre tecnologie mobili utilizzate dai dispositivi iOS garantiscono un indirizzo IP. (GPRS utilizzato per consentire solo X.25, ma solo nella prima versione obsoleta.) L'indirizzo IP potrebbe non essere instradabile pubblicamente, ma la stessa cosa è vera per la maggior parte delle reti WiFi e funzionano le stesse tecniche di punzonatura NAT. – abarnert

-1

Costruire un client Jabber per iOS: XMPP Setup

qui è link

+0

Correggetemi se ho torto, ma quel client non esegue effettivamente connessioni peer-to-peer tramite STUN/hole-punching, usa TURN per inoltrare tutto attraverso il server. E in effetti si basa sul fatto che il server TURN è Bonjour-able sulla rete locale. Quindi non è affatto una risposta alla domanda. – abarnert

+0

è il commento sopra vero? Stavo pensando di usare XMPP per fare STUN. – roocell

+0

@roocell sto provando a configurare il server client jabber e da lì a gestire il problema users.but nel creare server jabber, ho scaricato ejabber 2.10 ma non sono riuscito ad accedere nel pannello di amministrazione – freelancer

3

ho lavorato su qualcosa di simile ed è un dolore enorme nel culo. Ci sono 3 considerazioni: 1) Raggiungibilità 2) Scoperta 3) La connessione stessa.

1) Non considerare nemmeno l'utilizzo di 3g/4g, semplicemente non funzionerà correttamente per mantenere una connessione socket aperta.

2) Vorrei utilizzare una sorta di servizio di intermediazione tra i due su Internet per collegare i due. Per la scoperta, è sufficiente elencare quali dispositivi sono disponibili sul servizio.

3) Per la connessione, trovo che le librerie di socket IOS siano piuttosto dolorose da usare, ma se si scende al livello del socket BSD non è così male. Penso che sarebbe molto interessante usare zmq socket; che potrebbe semplificare la scrittura del servizio broker.

+1

# 1 è un buon punto. È necessario disporre di una logica a livello di applicazione per propagare le modifiche degli indirizzi (e rifare i buchi) ai peer quando cambiano indirizzo. Questo è fattibile, ma vuol dire che se vuoi connessioni affidabili, ordinate ea lungo termine, dovrai costruirle tu stesso a livello di applicazione, piuttosto che affidarti alla magia del TCP. – abarnert

+0

Oh, e significa anche che hai bisogno di una sorta di ID peer unico che sia persistente almeno all'interno di una sessione da usare come indirizzo, quindi puoi chiedere alla mesh il nuovo indirizzo del ragazzo con cui stavi parlando. – abarnert