Autor Wątek: Lobby Server  (Przeczytany 4054 razy)

Offline taki_tam

  • Użytkownik

# Listopad 26, 2007, 21:40:39
Siema! ;)

Pisze grę od jakiegoś czasu i bardzo mi zależy na tym, by był multi.
Ale jak na razie nie stać mnie na zakup własnego servera.

Więc wspomniałem sobie Soldata.
Zawsze jak uruchamiałem grę i zakładałem server, to po wczytaniu mapy pisało że gra jest rejestrowana w Lobby Server (i jeszcze coś o ASP było).
I wtedy wystarczyło, że podam kumplom moje IP wewnętrzne(!) i można było nawalać do woli.

Mam prośbe.
Czy jest ktoś z Was w stanie wytłumaczyć mi mniej więcej o co w tym chodzi? Czy za to się coś płaci? Na prawde, nie mam o tym zielonego pojęcia. W ogóle jak i czym się to je?

Pozdrawiam! ;) kompustelnik taki_tam

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline bluebat

  • Użytkownik

# Listopad 26, 2007, 22:19:18
Witam!
Z tego co pamiętam, w Soldacie nigdy nie udało mi się postawić serwa u mnie na wewnętrznym ip (zawsze kumple musieli rozpoczynać grę), być może jest to możliwe przez 'port forwarding' (w dokumentacji Azureusa trochę o tym jest napisane).
A sama budowa lobby serwera z tego co wiem jest prosta. Gdy ktoś tworzy serwer, wysyła automatycznie do lobby informację o tym, a tam już jest to przechowywane i gotowe do wyświetlenia przy wyszukiwaniu serwera. Nie musisz inwestować w drogi serwer na aplikację, najprostsze lobby dało by się zrobić w php+mysql - gra wysyła żądania przez http.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Listopad 26, 2007, 23:02:42
Co do łączenia się i serwerowania przez NAT'y, to jest to możliwe przy użyciu UDP:
- Klient musi znać zewnętrzny IP i port serwera.
- Serwer musi znać zewnętrzny IP i port klienta.
- Serwer i klient zaczynają na ślepo wysyłać pakiety UDP na podane porty.
- Początkowo pakiety przychodzące mogą zostać odrzucone przez NAT'a, ale już po wysłaniu pierwszego pakietu powinien on nadchodzące pakiety traktować jako odpowiedzi na pakiety wysyłane.
- No i mamy połączenie UDP w obie strony przez dwa NAT'y.

Co do wymiany informacji o IP i portach, to można użyć do tego serwera głównego, który przy okazji będzie mógł stwierdzić, jaki zewnętrzny IP i port przydzielił nam NAT. :)


Cytuj
Zawsze jak uruchamiałem grę i zakładałem server, to po wczytaniu mapy pisało że gra jest rejestrowana w Lobby Server (i jeszcze coś o ASP było).
I wtedy wystarczyło, że podam kumplom moje IP wewnętrzne(!) i można było nawalać do woli.
Jeżeli godzisz się na to, żeby podawać zainteresowanym IP samemu, to nie potrzebujesz żadnego serwera. Jeżeli masz kumpli w tej samej sieci, to podajesz IP wewnętrzne, a jeżeli w Internecie, to podajesz zewnętrzne. To zadziała jedynie dla połączeń TCP (dodatkowo serwer musi być forwardowany na NATcie). W przypadku połączeń UDP już nie będzie to tak prosto i nie jestem pewien, czy się da bez zewnętrznego serwera w przypadku dwóch NAT'ów.

Offline taki_tam

  • Użytkownik

# Listopad 27, 2007, 17:10:40
@Krzysiek K.

Zewnętrzne IP i port serwera (Lobby w tym wypadku) skąd mam znać? Ono jest stałe?
Zewnętrzne IP i port klienta(rozumiem że to gracz). Każdy użytkownik internetu ma coś takiego? Ja wiem że jest wewnętrzne.*

* Lobby server (czyli chyba serwer główny, ja to tak rozumiem) przydzieli mi zewnętrzne IP i port?

Cytuj
Jeżeli godzisz się na to, żeby podawać zainteresowanym IP samemu, to nie potrzebujesz żadnego serwera. Jeżeli masz kumpli w tej samej sieci, to podajesz IP wewnętrzne, a jeżeli w Internecie, to podajesz zewnętrzne. To zadziała jedynie dla połączeń TCP (dodatkowo serwer musi być forwardowany na NATcie). W przypadku połączeń UDP już nie będzie to tak prosto i nie jestem pewien, czy się da bez zewnętrznego serwera w przypadku dwóch NAT'ów.


W soldat jest przecież tak, że podaje kumplom moje wewnętrzne IP i jak zakładam serwer to jest on rejestrowany w Lobby. I nie są oni w tej samej sieci co ja a mimo to łączą się ze mną przez moje IP wewnętrzne. (tego jestem pewien jak niczego innego)
Powiedziałeś też że działa to na TCP a soldat jest na UDP i gramy przez moje IP wewnętrzne.

BTW. Proszę naprowadźcie mnie jakoś bo ja na prawdę jestem w sieci lewy...  :-\
BTW2. Jakie są możliwości uzyskania IP zewnętrznego bez żadnych serwerów pośrednich?

Pozdrawiam! ;) kompustelnik taki_tam

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Listopad 27, 2007, 17:51:45
Cytuj
Zewnętrzne IP i port serwera (Lobby w tym wypadku) skąd mam znać? Ono jest stałe?
Zewnętrzne IP i port klienta(rozumiem że to gracz). Każdy użytkownik internetu ma coś takiego? Ja wiem że jest wewnętrzne.*
IP i port serwera głównego powinny być stałe i znane dla naszego programu. Można też podejść do tego klasycznie i użyć DNS'a do pobrania IP (port ustalamy sobie jak chcemy - my piszemy program, więc będzie nam znany).

IP ma każdy podłączony do jakiejkolwiek sieci korzystającej z TCP, czy UDP - inaczej nie mógłbyś nawet przeglądać WWW, bo serwery nie wiedziały by gdzie odesłać zawartość stron. W przypadku sieci lokalnych za firewallem najczęściej mamy dwa adresy IP - pod lokalnym nasz komputer jest widoczny wewnątrz sieci, a pod zewnętrznym widziana jest nasza sieć przez resztę świata.

Cytuj
BTW2. Jakie są możliwości uzyskania IP zewnętrznego bez żadnych serwerów pośrednich?
Samemu tego nie uzyskasz, bo zewnętrzne IP jest przydzielane zwykle z zewnątrz i dzieje się to na różny sposób (np. w przypadku Neostrady zewnętrzne IP jest przydzielane praktycznie losowo podczas ustanawiania połączenia). Tak, czy inaczej, swoje aktualne IP możesz poznać przykładowo korzystając z http://whatismyip.com/.

Offline taki_tam

  • Użytkownik

# Listopad 27, 2007, 17:55:25
Te stronki do sprawdzenia IP właśnie znam.
Ale to które mi się tam wyświetli to jest IP zewnętrzne?

EDIT:
Np. jeśli napisze prosty komunikator klient serwer, odpale te serwer na moim kompie i dam koledzie klienta wraz z moim IP(tym z tej strony) to dojdzie do połączenia? Bo kiedyś mi się nie chciało połączyć. Więc pomyślałem że to IP wewnętrzne i kolega nie może się ze mną przez nie połączyć.

Pozdrawiam! ;) kompustelnik taki_tam
« Ostatnia zmiana: Listopad 27, 2007, 17:58:20 wysłana przez taki_tam »

Offline Moriturius

  • Użytkownik

# Listopad 27, 2007, 17:58:23
Zewnętrzne IP i port serwera (Lobby w tym wypadku) skąd mam znać? Ono jest stałe?
Jeśli aplikacja-serwer chodzi u Ciebie na kompie to adresem będzie Twój adres zewnętrzny. Dodatkowo jeszcze musisz ew. przekierować na routerze porty odpowiednie.

Zewnętrzne IP i port klienta(rozumiem że to gracz). Każdy użytkownik internetu ma coś takiego? Ja wiem że jest wewnętrzne.*
Każdy. Każda maszyna w sieci ma swój własny adres w sieci lokalnej. Dodatkowo ISP (dostawca internetu) przydziela IP przy połączeniu z internetem więc każdy kto jest w internecie ma swój adres zewnętrzny. Jeśli w domu masz router i więcej komputerów to adres zewnętrznyjest jeden dla sieci i przy połączeniu z internetu na ten adres klient łączy się z Twoim routerem (dlatego trzeba przekierować odpowiednie porty)

* Lobby server (czyli chyba serwer główny, ja to tak rozumiem) przydzieli mi zewnętrzne IP i port?

BTW2. Jakie są możliwości uzyskania IP zewnętrznego bez żadnych serwerów pośrednich?
Tylko ISP może przydzielić IP Ci zewnętrzne IP.

W soldat jest przecież tak, że podaje kumplom moje wewnętrzne IP i jak zakładam serwer to jest on rejestrowany w Lobby. I nie są oni w tej samej sieci co ja a mimo to łączą się ze mną przez moje IP wewnętrzne. (tego jestem pewien jak niczego innego)
To trochę dziwne bo przecież w internecie jest niezliczona ilość podsieci w których każdy komputer ma jakiśtam swój adres i one się często powtarzają (zwłaszcza np te: 192.168.x.x)

Powiedziałeś też że działa to na TCP a soldat jest na UDP i gramy przez moje IP wewnętrzne.
Można powiedzieć, że TCP jest w pewnym sensie rozbudowaniem UDP więc jeśli coś będzie działać z TCP to tym bardziej z UDP ^^

// EDIT:

Cytuj
Np. jeśli napisze prosty komunikator klient serwer, odpale te serwer na moim kompie i dam koledzie klienta wraz z moim IP(tym z tej strony) to dojdzie do połączenia? Bo kiedyś mi się nie chciało połączyć. Więc pomyślałem że to IP wewnętrzne i kolega nie może się ze mną przez nie połączyć.

No jeśli Twój komputer jest podłączony bezpośrednio do internetu ( bez routera ) to wtedy powinno się dać nawiązać połączenie przez to IP zewnętrzne które sprawdzasz na stronie.
UWAGA: warto też pamiętać o tym, że nasze IP zewnętrzne może być zmienne więc lepiej nie wklepywać go na stałe w programie ;)
« Ostatnia zmiana: Listopad 27, 2007, 18:03:05 wysłana przez Moriturius »

Offline taki_tam

  • Użytkownik

# Listopad 27, 2007, 18:09:05
No korzystam z Neostrady i mam w domu taką małą (na oko 10x15x2 cm) skrzynke, zdaje się modem się to nazywa :)
Więc da rade się połączyć z innym użytkownikiem przez to IP ze strony?(pytam jeszcze raz bo chciałem wyjaśnić kwestię tej "skrzynki" :) )

Pozdrawiam! ;) kompustelnik taki_tam

EDIT:
Cytuj
W soldat jest przecież tak, że podaje kumplom moje wewnętrzne IP i jak zakładam serwer to jest on rejestrowany w Lobby. I nie są oni w tej samej sieci co ja a mimo to łączą się ze mną przez moje IP wewnętrzne. (tego jestem pewien jak niczego innego)

Chodziło mi tu oczywiście o to IP z tych stron.
« Ostatnia zmiana: Listopad 27, 2007, 18:13:48 wysłana przez taki_tam »

Offline Moriturius

  • Użytkownik

# Listopad 27, 2007, 18:13:44
No korzystam z Neostrady i mam w domu taką małą (na oko 10x15x2 cm) skrzynke, zdaje się modem się to nazywa :)
Więc da rade się połączyć z innym użytkownikiem przez to IP ze strony?(pytam jeszcze raz bo chciałem wyjaśnić kwestię tej "skrzynki" :) )
Jeśli łączysz się przez to co dostałeś z TPSA (podłączone pod USB do kompa) to powinieneś być połączony z netem bezpośrednio więc powinno się dać. Warto też pamiętać aby odblokować odpowiedni port w firewallu na kompie ^^. BTW: jeśli to jest modem TPSA to powinien byc raczej mniejszy niz podales :P

Pozdrawiam! ;) kompustelnik taki_tam

Dziękować dzięwkoać :P

Offline taki_tam

  • Użytkownik

# Listopad 27, 2007, 18:15:19
Cytuj
BTW: jeśli to jest modem TPSA to powinien byc raczej mniejszy niz podales Tongue
No widać kiepsko oceniam wymiary "na oko"

Pozdrawiam! ;) kompustelnik taki_tam

BTW. Plusiki dla Krzysiek K. i Moriturius ;)

Offline Grabarz

  • Użytkownik

# Listopad 27, 2007, 21:23:09
Jest też coś takiego jak no-ip.pl, chociaż jeszcze się tym nie interesowałem to wydaje mi się najlepszym rozwiązaniem.

Offline skiter

  • Użytkownik

# Listopad 28, 2007, 10:31:29
http://ip-address.domaintools.com/myip.xml

Pobierasz XML'a i sobie prasujesz swoj adres IP.

http://www.heise-online.pl/security/articles/27/1

O wierceniu dziurek w UDP i NAT.

http://www.kwant.info/howto/mirror/neas/tunelowanie.html

O tunelach :P, czyli jak miec "zewnetrzny IP", jezeli bys mial jakis zblokowany :P, w co osobiscie watpie ...

Offline TRSSpy

  • Użytkownik

# Listopad 29, 2007, 01:20:10
Witam,

jako autor lobby serwera do soldata (który nota bene przyczynił się do jego popularności gry na tyle, że mogła ona stać się komercyjna :) ), mogę napisać co nieco:

W rzeczywistości lobby serwer poza rejestrowaniem gier umożliwiał też dzięki swojemu 'pośrednictwu' odwrócenie ról (klient/serwer) podczas rozpoczynania gry - oczywiście oznacza to że co najmniej jedna ze stron musi mieć zewnętrzne IP.

Jako że cała komunikacja w soldacie jest oparta na UDP to po przesłaniu pary komunikatów między dwoma komputerami mamy 'nawiązane połączenie'. Schemat działania był (o ile dobrze pamiętam) następujący:
1. Serwer A (z wewnętrznym IP) rejestrował się w lobby. Lobby zawsze odpowiadał na IP/port z którego dostał pakiet. W związku z tym było 'nawiązane połaczenie' między serwerem A, a lobby serwerem.
2. W momencie gdy ktoś chciał dołaczyć do serwera A (który teoretycznie jest niewidzialny na zewnątrz) wysyłał informacje o tym do serwera lobby. Lobby natomiast przekazywał tę informacje do Serwera A, który ROZPOCZYNAŁ transmisję z Graczem B. Dzięki temu Gracz B 'dołaczał' do serwera A. Chociaż w rzeczywistości to serwer A (za NAT'em) rozpoczynał wymianę pakietów UDP. Oczywiście gracz B musi już mieć zewnętrzne IP.

To był taki algorytm wymyślony na szybko już parę ładnych latek temu, pewnie można by go różnie udoskonalać. Jakby ktoś miał jakąś fajną grę to oczywiście służę pomocą z lobby. Chociaż jak słusznie zauważyli poprzednicy można do tego wykorzystać jakiś darmowy hosting z obsługa php/mysql - chociaż zabawy z tym pewnie byłoby więcej.
 

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Listopad 29, 2007, 03:27:37
Cytuj
2. W momencie gdy ktoś chciał dołaczyć do serwera A (który teoretycznie jest niewidzialny na zewnątrz) wysyłał informacje o tym do serwera lobby. Lobby natomiast przekazywał tę informacje do Serwera A, który ROZPOCZYNAŁ transmisję z Graczem B. Dzięki temu Gracz B 'dołaczał' do serwera A. Chociaż w rzeczywistości to serwer A (za NAT'em) rozpoczynał wymianę pakietów UDP. Oczywiście gracz B musi już mieć zewnętrzne IP.
Można to usprawnić tak, żeby nie musiał, tak jak napisałem trochę wyżej. :)