Autor Wątek: Wyszukiwanie serwera w LAN (socket)  (Przeczytany 2122 razy)

Offline Hans

  • Użytkownik

# Marzec 20, 2011, 21:49:14
Przeszukałem sieć wzdłuż i w szerz, i wszędzie stoi coby to zrobić broadcastem (UDP), tyle że wtedy muszę znać numer portu który chcę zaspamować. Co w sytuacji gdy user (stawiający serwer) chce sobie sam zdefiniować port bo domyślny jest np wykorzystywany albo chce postawić dwa serwery na różnych portach?

Zainstalowałem sobie wireshark'a coby podejrzeć jak to robi valve (testowałem na hl2dm, innych gier multi nie instalowałem (zresztą poza valve żadnej innej nie mam razem z serwerem)), i tam wygląda jakby klient hl2dm broadcastował na 10 portów (27015+ i 26900+), czyli jak zmieniłem serwerowi na 28000 to już nic nie znalazł w LAN'ie. To jest jedynie słuszne rozwiązanie? (tzn, wybrać kilka portów, zablokować userowi wybór i postawić serwer na pierwszym wolnym). Jak to robią inne gry?

(pomijając tryb 'internet' z master-serwerami, listami itp)

Offline Mr. Spam

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

Offline Esidar

  • Użytkownik

# Marzec 20, 2011, 23:36:51
To jedyne słuszne rozwiązanie. Broadcast do wszystkich portów trwa niezwykle długo.

Offline Hans

  • Użytkownik

# Marzec 21, 2011, 02:56:50
W międzyczasie znalazłem info, że można to rozwiązać  idąc warstwę niżej (do IP) http://stackoverflow.com/questions/1233041/how-to-listen-for-broadcast-packets-on-any-port, ale myślę że to już trochę za dużo jak na zwykłą aplikacje klient/serwer.

Zresztą tragedii nie ma, dorobię możliwość nadpisania domyślnych portów w rejestrze/config'u (ale niewidoczne w normalnych ustawieniach) i już nie będzie zaszyte w kodzie, a user będzie sie cieszył, że jedno pole mniej do wypełnienia :)

Jeszcze odnośnie portów, według http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers porty 1024 - 49151 są rejestrowane, ich użycie jest w jakiś sposób ograniczone? bo ja tam różnicy nie zauważyłem, ani tego żeby ktoś się tym przejmował (patrz te wszystkie unofficial'e)


Offline Liosan

  • Redaktor

# Marzec 21, 2011, 08:02:34
W międzyczasie znalazłem info, że można to rozwiązać  idąc warstwę niżej (do IP) http://stackoverflow.com/questions/1233041/how-to-listen-for-broadcast-packets-on-any-port, ale myślę że to już trochę za dużo jak na zwykłą aplikacje klient/serwer.
Brzmi jak problem z uprawnieniami dla nie-adminów...

Liosan

Offline Dab

  • Redaktor
    • blog

# Marzec 21, 2011, 17:56:10
W międzyczasie znalazłem info, że można to rozwiązać  idąc warstwę niżej (do IP) http://stackoverflow.com/questions/1233041/how-to-listen-for-broadcast-packets-on-any-port, ale myślę że to już trochę za dużo jak na zwykłą aplikacje klient/serwer.
Brzmi jak problem z uprawnieniami dla nie-adminów...

Liosan

Gorzej -- Wireshark wymaga instalacji swojego specjalnego drivera. Dla gry to nieakceptowalne (chociaż oczywiście matoły od DRM twierdzą inaczej).

A co do tematu -- skoro mowa o LAN to może da się to zrobić na odwrót? Każdy klient nasłuchuje na tym samym porcie a serwery co jakiś wysyłają informację o sobie (z numerem portu). Trochę spam, ale...

Offline Rolek

  • Użytkownik

# Marzec 21, 2011, 19:42:50
Broadcast do wszystkich portów trwa niezwykle długo.
U mnie nie przekracza 5 sekund :P

Offline maciek_slon

  • Użytkownik

# Marzec 22, 2011, 10:43:53
A co do tematu -- skoro mowa o LAN to może da się to zrobić na odwrót? Każdy klient nasłuchuje na tym samym porcie a serwery co jakiś wysyłają informację o sobie (z numerem portu). Trochę spam, ale...

Nadal występuje problem zajętych portów, tylko tym razem po stronie klientów ;P

Offline Dab

  • Redaktor
    • blog

# Marzec 22, 2011, 14:01:00
Nadal występuje problem zajętych portów, tylko tym razem po stronie klientów ;P

Mimo wszystko możliwość uruchomienia kilku serwerów naraz wydaje mi się cenniejsza niż możliwość odpalenia kilku klientów gry naraz ;)

Offline Hans

  • Użytkownik

# Marzec 22, 2011, 16:22:37
Z tego co wyczytałem, zaleca się aby klient miał port dynamiczny/tymczasowy (bo tak ponoć bezpieczniej), zresztą porównując poziom rozsyłanego spamu, klient broadcastuje tylko raz (raz na polecenie odśwież :) ) a serwer musiałby zapodawać cały czas.

Kilka serwerów przy LAN'ie na jednym kompie pewnie będzie rzadkością (co innego internet, ale tam user musi podać port który jest przekierowany z zewnątrz, więc może to sobie konfigurować wedle uznania). Tak czy inaczej, wytypowałem 10 niezarejestrowanych portów, więc teoretycznie można postawić 10 LANowych serwerów.

@Rolek, 5s to całkiem sporo, zwłaszcza, że pewnie zapcha się router, pogubi pakiety i trzeba będzie od nowa :) więc pozostanę przy wytypowanych 10. Jak testowałem swoją sieć WiFi to gubiła pakiety sama z siebie, więc pewnie standardowo trzeba wysłać więcej niż raz na jeden port (albo niech user wtedy odświeża ręcznie).

(btw, to moje pierwsze podejście do sieci, więc poprawcie mnie jakbym gadał od rzeczy :) )

Offline Esidar

  • Użytkownik

# Marzec 23, 2011, 12:00:39
Z tego co wyczytałem, zaleca się aby klient miał port dynamiczny/tymczasowy (bo tak ponoć bezpieczniej), zresztą porównując poziom rozsyłanego spamu, klient broadcastuje tylko raz (raz na polecenie odśwież :) ) a serwer musiałby zapodawać cały czas.
Klient nie ma portu. To server ma port przez który klient się łączy. Natomiast częste zmienianie portu na serwerze nie pomoże w bezpieczeństwie :)

Port dynamiczny/tymczasowy zapewne ci się pomyliło z NAT traversal. Routery stosują taką "sztuczkę", że gdy twój lokalny komputer w LAN się łączy z serwerem w internecie np. na port 26000, to router przydziela mu tymczasowy port zewnętrzny np. 45782. Dzięki temu, jeśli jakiś pakiet wróci z serwera, to router wie że pakiet przychodzący na port o nr. 45782, zostanie przesłany dalej do lokalnego komputera LAN o adresie np. 192.168.1.6.

Offline Hans

  • Użytkownik

# Marzec 23, 2011, 13:46:23
Pisząc port dynamiczny/tymczasowy miałem na myśli http://en.wikipedia.org/wiki/Ephemeral_port, numer przypisany przez system, gdy socketa klienta binduje się z portem 0.

Czyli dzięki NAT traversal, klient łączy się jak zawsze, bez żadnej extra konfiguracji routera? (to by tłumaczyło czemu gry działają, pomimo że nie podawałem żadnych portów ani nie robiłem zmian w konfiguracji)