Robię na własne potrzeby eksperymenty z transmisją UDP w C++/Qt.
Napisałem sobie aplikację bazując na https://stackoverflow.com/questions/20125641/udp-server-client-chat-in-c-qt (jest prawie kopią przedstawionego kodu) i ona działa poprawnie. W moim przypadku, aplikacja ma jedno gniazdo, a jak chcę zrealizować test połączenia, to uruchamiam dwie instancje.
U mnie wszystko działa, jednak stwierdziłem, żeby działało, to na obu aplikacjach muszę uruchomić socket i zbindować na innym porcie, a przy wysyłaniu lub odbieraniu muszę znać adres IP i numer drugiego portu komputera.
UDP ma tą cechę, że powoduje mniejsze obciążenie sieci i komputerów w zamian za brak gwarancji dotarcia każdego komunikatu i brak kontroli zachowania kolejności komunikatów.
Załóżmy, że chciałbym zrealizować komunikację UDP między dwoma komputerami w takiej kolejności:
Jest router 1, który ma serwer DHCP, do niego podłączony jest komputer A i router 2. Natomiast router dwa ma swój serwer DHCP i do siebie podłączony komputer B. Router 1 rozdaje adresy z puli 192.168.1.x i komputer A dostał 192.168.1.2, a router 2 dostał 192.168.1.3. Router 2 rozdaje adresy z puli 192.168.2.z i komputer B dostał adres 192.168.2.2. Na routerach nie są ustawione żadne przekierowania transmisji.
W przypadku TCP, przy takiej konfiguracji, jak komputer A jest serwerem, to komputer B może się podłączyć posługując się adresem 192.168.1.2, natomiast jak komputer B jest serwerem, to komputer A nie może się podłączyć, bo komputer A nie dotrze pod adres 192.168.2.2, a pod adres 192.168.1.3 nie dotrze do komputera B, bo na routerze nie ma przekierowania, nie ma ograniczeń puli otwartych portów.
Jednak po uzyskaniu połączenia można wysyłać komunikaty w obie strony.
Natomiast przy UDP nie ma czegoś takiego, jak połączenie. W tej konfiguracji udało mi się wysłać pakiet z B do A, ale z A do B nie udało mi się wysłać.
Skoro wszystkie media strumieniowe działają w oparciu o UDP, to musi dać się zrealizować komunikację UDP w obie strony przy przedstawionej konfiguracji, po poprzez analogię, przy odbiorze radia internetowego, komputer A będzie serwerem rozgłośni, a komputer B będzie moim komputerem, na którym słucham radia, więc musi dać się wysłać UDP z A do B.
W jaki sposób można zrealizować transmisje UDP w obie strony w podanej konfiguracji bez żadnych zmian w połączeniach i konfiguracji sieci?
hole punching
. Ale W przypadku, gdy jeden z adresów jest bezpośrednio dostępny, nie ma to sensu.