[WinSocket][C++] Protokół P2P - implementacja


(wojtek20124) #1

Chcę zaimplementować protokół p2p w mojej grze.
Googlując nic nie można znaleźć na temat. Dokładnie - znalazłem implementację protokołu BitTorrent i jeszcze coś w podobie, a reszta - nic. Protokół BitTorrent raczej mi nie pomoże, bo opiera się także na zewnętrznych serwerach (trackery). Czy możliwe jest zaimplementowanie protokołu p2p? Sporym problemem jest NAT!


#2

Poszukaj pod hasłem ‘networked multiplayer p2p’ lub ‘networked multiplayer’. Ewentualnie zadaj pytanie na stackexchange lub stackexchange

Połączenie NAT<->NAT jest niemożliwe bez serwera pośredniczącego. Musiałbyś wylosować gracza który ma otwarte porty przychodzące i uczynić go serwerem.
Do emulatorów by grać przez internet była biblioteka kaillera. Może nią się zainteresuj. Była jej wersja p2p i serwerowa.


http://www.sensiblesoccer.de/forum/index.php?topic=4817.0
Fs-uae ma obsługę gry przez internet, ale nie zaglądałem w źródła.
https://fs-uae.net/

BitTorrent nie potrzebuje trackerów. Może użyć DHT.


Nic nie idzie na przeszkodzie byś użył darmowych trackerów BitTorrenta. Ale one tylko zapisują IP. 1 klient łączy się z trackerem, tracker zapisuje jego ip i przekazuje mu ip innych klientów. Klienty jak maja swoje ip to się łączą bezpośrednio ze sobą (p2p), oczywiście dwa klienty za natem się nie połączą.
Do tego możesz wykupić najtańszy hosting php.


(wojtek20124) #3

PHP? A po co mi to? Dwa clienty za natem się nie połączą?
Mam argumenty, że cudem to się uda.
Jak w protokole BitTorrent clienty wysyłają seed’y do pobierających, to nie ma łącza p2p?
I jakimś cudem Valve zaprzecza prawom NAT’u i organizuje w swoich grach połączenie P2P!!! Na obu clientach NAT, a połączenie odbywa się z pośredniczeniem Steam (może).
W grach Garry’s Mod i Counter-Strike: Global Offencive jakoś P2P (albo server-client) łamią prawa NAT’u. W Gmod na pewno server przez grę można utworzyć na połączeniu P2P. 5 pingu ma ten w CS:GO, kto hostuje server, a łączący ma sumę pingu własnego i hostującego (mniej więcej).
Mój powyższy opis powinien przekonać, że jakimś cudem to działa!!! W Left4Dead2 czasem ten sposób działa a czasem sypie dla łączących bugiem zniknięcia paska Loading.
Więc nie wmawiajcie mi, że to niemożliwe, bo Valve jakoś tego dokonał!!!


(kostek135) #4

To zrozum, że się nie da tego zrobić. Powód jest prosty - masz router, który tworzy NAT. Za tym routerem są dwa komputery, na których naraz uruchomiona jest usługa otwierająca ten sam port. Przy łączeniu się na router na który komputer magicznie ma nastąpić przekierowanie?

Co innego jeśli z komputera za NAT-em zainicjowano połączenie na serwer. W tym celu adres lokalnego komputera musiał zostać zbindowany z wolnym portem na routerze. Serwer do którego zostało otwarte połączenie może tę informację (który port) przekazać innym usługom.

W przypadku Steam, to serwer Steam jest platformą pośredniczącą. Czyli takim niby trackerem.

PS
Hah. Nawet Steam prosi o otwarcie portów w swojej instrukcji: https://support.steampowered.com/kb_article.php?ref=8571-GLVN-8711 ty na pewno wiesz czym jest NAT?


(wojtek20124) #5

Ja i mój kolega mieszkający o 1km mamy własne routery z brakiem możliwości przekierowywania portów (nie mamy loginów i haseł do routerów). Ja zapraszam kolegę w CS:GO do mojej poczekalni i startuję serwer (lokalny, bo mam ping stale na 5). Kolega dołącza normalnie i gra. Czy ja aż tak głupi, czy złudzenie optyczne? Wytłumacz mi, jak działa ten mechanizm : ja serwer, ty klient a gdzie Network Address Translator? Albo oni kombinują z portami UDP, albo używają czarnej magii!!


(kostek135) #6

Proste. Jak widzisz na tej stronie porty są znane i stałe. Tak tak - główka pracuje. Steam jest tak popularny, że tylu klientów waszych ISP już tak ich zasypało zgłoszeniami, typu: “omg omg stim mi nie działa 111!!!1one”, że zaczęli instalować ludziom routery z przekierowanymi najważniejszymi portami (battlenet/steam/etc).

Więc wracając - co zrobić, żeby tak mieć? Stań się w ch*j sławny. Simple.