2012-04-18 13 views
13

Chcę podłączyć wiele urządzeń poprzez gniazdo bez żadnych implementacji serwera. Będę używał tego tylko do uzyskania adresów IP urządzeń, które się zarejestrują.Czy można podłączyć dwa urządzenia ios przy użyciu gniazd, pobierając adresy IP?

+1

Być może usługa Bonjour jest tym, czego szukasz? – user523234

+0

Nie, urządzenia, które mają zostać podłączone, nie będą znajdować się w tej samej sieci. Będą połączone przez swoje sieci 3G lub połączenie GPRS operatora sieci. – AnishGupta

+3

Potrzebny Ci będzie mechanizm wykrywania. Jeśli urządzenia nie znajdują się w tej samej sieci, potrzebujesz jakiegoś serwera. Jeśli urządzenia są w sieci 3G, nie możesz mieć pewności, że ich adres IP będzie niepowtarzalny. – starbugs

Odpowiedz

4

Można użyć GameKit. Ma api matchmaking, które mogą ci pomóc.

Może być używany do aplikacji innych niż gry.

+0

to api apodyktyczne działające w Internecie? ponieważ chcę tego rodzaju mechanizmu, który może łączyć wiele urządzeń przez Internet. Według mojej wiedzy Gamekit jest w stanie podłączyć urządzenia tylko przez bluetooth lub sieć lokalną. – freelancer

+0

Działa również przez Internet! – MacTeo

+3

Mylicie dwie rzeczy. GKSession, peer-to-peer część GameKit, działa tylko przez bluetooth lub sieć lokalną. GKMatchmaker działa w Internecie, ale nie jest to peer-to-peer: wszystko jest kierowane przez serwery Apple lub własne. Z niestandardowym serwerem i odrobiną pracy, może być użyty jako element wprowadzający dla prawdziwej sieci P2P, ale sam w sobie nie jest w stanie rozwiązać problemu. – abarnert

9

Istnieją dwa główne problemy w komunikacji peer-to-peer: wykrywanie i osiągalność.

Najpierw musisz znać adres IP innych urządzeń równorzędnych, aby się z nimi połączyć. Gdy jesteś już połączony z siecią rówieśników, wszyscy mogą się wzajemnie informować na bieżąco o stanie sieci, sugerując sobie nawzajem lepszą znajomość, przekazywanie powiadomień o nowych rówieśnikach, którzy dołączyli i odeszli, itd. Ale masz zaprojektować i wdrożyć mechanizm handlu tymi informacjami. Co ważniejsze, musisz w jakiś sposób coś zacząć, ponieważ kiedy nowy rówieśnik się uruchamia, jest w samej siatce i nie ma żadnych informacji, które mógłby podać.

Jedną z możliwości jest posiadanie garści znanych "superplaków" (które uruchamiasz), które są zawsze połączone, i upiecz swoje adresy w aplikacji. Lub możesz mieć "serwery wprowadzające" zamiast rówieśników, obsługujących znacznie tę samą funkcję. Lub możesz mieć jakiś zewnętrzny sposób handlu adresami (najprościej jest, że użytkownicy wymieniają je na forum internetowym lub kanale IRC lub osobiście i wpisują je ręcznie), które mogą być zautomatyzowane w różnym stopniu. Istnieją również skróty, które mogą pomóc - Bonjour może uzyskać innych peerów na siatce, dopóki jeden rówieśnik w sieci LAN już tam jest; GameCenter/GameKit może być używany jako automatyczna zewnętrzna sieć handlowa; itp.

Po rozwiązaniu problemu z wykrywaniem nadal masz problem z osiągnięciem. Większość urządzeń z systemem iOS zazwyczaj nie ma publicznie dostępnych adresów IP; zamiast tego znajdują się one za routerami, które wykonują translację adresów sieciowych, niezależnie od tego, czy są routerami WiFi w domu, czy siecią 3G operatora sieci komórkowej. Oznacza to, że potrzebujesz sposobu, aby wykonać dziurkowanie z otworem NAT, aby połączyć ze sobą dwa iPhony. Ktoś, kto zna zarówno adres publiczny, jak i adres wewnętrzny każdego urządzenia, może je skonfigurować do nawiązania połączenia ze sobą. Możesz zrobić to normalnym rówieśnikom (chociaż to sprawia, że ​​problem ze skokiem jest jeszcze większy) lub masz superpeery/serwery wprowadzające/etc. Zrób to.

Jeśli chcesz zbudować to wszystko sam, prawdopodobnie chcesz spojrzeć na inne implementacje. BitTorrent (w tym trackery i DHT) jest dobrze zrozumiany i udokumentowany na kontinuum poziomów od "kłamstwa-dzieci" dla ciekawskich użytkowników końcowych po szczegółowe specyfikacje protokołów i implementacje open source. A potem spójrz na inne sieci P2P, ponieważ BitTorrent nie jest doskonały i nie próbuje zrobić wszystkiego, co wszyscy wymyślą.

+1

Zobacz http://stackoverflow.com/questions/6421742/tcp-hole-punching-onhone, aby uzyskać więcej informacji na temat dziurkowania w systemie iOS. Zobacz http://www.rahul.net/dholmes/ctorrent/ źródło dla ulepszonego cTorrenta, klienta BitTorrent dla iPhone'a. – abarnert

+1

Dodatkowy problem występuje w przypadku długotrwałych połączeń trwałych: iPhone zmienia adresy przez cały czas. Musisz więc wykryć to z jednej lub drugiej strony i ewentualnie ponownie uderzyć w otwór, aby przywrócić połączenie. Istnieją pewne protokoły P2P, które biorą to pod uwagę (sądzę, że działa program RTMFP firmy Adobe, ale nie wiem, czy stare biulety objaśniające, jak to działało, są nadal dostępne), ale większość nie, ponieważ zostały zaprojektowane dla systemów stacjonarnych . – abarnert

0

Nie możesz. Jeśli urządzenie jest w trybie online z siecią Wi-Fi, być może jest to możliwe i polegać na ustawieniach routera, tak jak PC Connect. Jeśli jakieś urządzenie jest połączone z protokołem 3g lub gprs, może w ogóle nie mieć adresu IP.

+0

Nieprawda. GPRS i wszystkie inne technologie mobilne używane przez urządzenia z iOS gwarantują adres IP. (GPRS używane tylko do X.25, ale tylko w przestarzałej pierwszej wersji). Adres IP nie może być publicznie rutowany, ale to samo dotyczy większości sieci Wi-Fi i działają te same techniki dziurkowania NAT. – abarnert

-1

Budowanie klient Jabbera dla iOS: XMPP Konfiguracja

tutaj jest link

+0

Popraw mnie, jeśli się mylę, ale ten klient nie wykonuje połączeń typu peer-to-peer przez STUN/dziurkowanie, używa TURN do przekazywania wszystkiego przez serwer. W rzeczywistości polega on na tym, że serwer TURN jest w sieci lokalnej w stanie Bonjour. Więc to nie jest odpowiedź na to pytanie. – abarnert

+0

czy powyższy komentarz jest prawdziwy? Myślałem o używaniu XMPP do STUN-a. – roocell

+0

@roocell próbuję ustawić serwer klienta jabber i stamtąd obsługiwać problem users.but w tworzeniu serwera jabber, pobrałem ejabber 2.10 ale nie mogę się zalogować w panelu administracyjnym – freelancer

3

pracuję nad czymś podobnym i to olbrzymi wrzód na dupie. Istnieją trzy kwestie: 1) Zasięg 2) Odkrycie 3) Samo połączenie.

1) Nawet nie rozważaj używania 3g/4g, to po prostu nie zadziała dobrze przy utrzymywaniu otwartego połączenia z gniazdem.

2) Korzystałbym z usług pośrednika między tymi dwoma w Internecie, aby połączyć te dwa. W przypadku wykrywania można po prostu wyświetlić listę urządzeń dostępnych w usłudze.

3) Dla połączenia, uważam, że biblioteki gniazd IOS są dość bolesne w użyciu, ale jeśli zejdziesz na poziom BSD, to nie jest tak źle. Myślę, że byłoby bardzo interesujące korzystanie z gniazd zmq; które mogą uprościć pisanie usługi brokera.

+1

# 1 to dobry punkt. Musisz mieć jakąś logikę poziomu aplikacji, aby propagować zmiany adresu (i ponownie dziurkować) dla rówieśników, gdy zmieniają adres. Jest to wykonalne, ale oznacza to, że jeśli chcesz niezawodne, uporządkowane, długoterminowe połączenia, będziesz musiał je zbudować samodzielnie na poziomie aplikacji, zamiast polegać na magii TCP. – abarnert

+0

Och, a to oznacza również, że potrzebujesz jakiegoś unikalnego identyfikatora rówieśnika, który jest trwały przynajmniej w ciągu sesji, aby użyć go jako adresu, więc możesz poprosić o oczekujący adres nowego gościa, z którym właśnie rozmawiałeś. – abarnert

Powiązane problemy