Witam,
Do komunikacji z pewnym urządzeniem protokołem UDP potrzebuję mu posłać lokalny adres IP komputera. Adres lokalny trzeba zaszyć w pakiecie ramki startowej, która odbierana jest po UDP i wtedy urządzenie odpowiada na podany w ten sposób adres. Jeśli interfejs sieciowy w komputerze jest jeden to problemu nie ma natomiast jeśli interfejsów będzie więcej (a tak często jest na dużych serwerach na których działa aplikacja przez zdalny pulpit) to zaczynają się schody a zwłaszcza jeśli jest jeszcze VPN.
Funkcja GetIpAddresses dostępna w JclSysInfo zwróci adresy IP kilku interfejsów i nie wiem który zaszyć w ramce. Próbowanie po kolei na chybił trafił odpada bo raz wysłana poprawna ramka zawłaszcza urządzenie na kilka minut i jeśli adres był nieprawidłowy to przez kilka minut nie będzie z nim komunikacji. Jedyne co znam to adres IP:port urządzenia na którym nasłuchuje.
W pierwszej chwili myślałem że wystarczy zrobić iloczyn adresu i maski co da nam adres sieci, jeśli będą takie same dla urządzenia i localhosta to będzie to właściwy interfejs. Niestety są sytuacje, że w tablicy routingu (route print) np. przy tworzeniu openvpn dodawane są jeszcze dodatkowe wpisy i nagle się okazuje, że pojawiają się dodatkowe adresy które nie spełniają tego warunku adres*maska a mimo to są osiągalne w sieci i taki przypadek również musiałbym przewidzieć.
Pytanie w jaki sposób mógłbym się do tego dostać, prasowanie tekstu zwróconego przez route print odpada. Zapewne są jakieś funkcje w Delphi, które za to odpowiadają (pewnie coś w INDY). Czy mak ktoś jakieś w tym doświadczenie i sugestie?
Ja to nie rozumiem o co chodzi. Jest sobie komputer i ma kilka interfejsów sieciowych. każdy ma swój lokalny adres IP. Nagle przychodzi koleś i wkłada sobie losowo kolejne sieciowe karty i restartuje maszynę i wtem pojawiają się nowe interfejsy sieciowe z randomowym adresem IP.
Masz komputery lokalne, do których ktoś się łączy przez zdalny pulpit, ale co do tego ma VPN? czy zdalny komputer łączy się przez VPN gdzieś, czy ty się łączysz przez VPN i potem włazisz na zdalny pulpit. VPN to tak samo jakbyś był w lokalnej sieci więc nie ma z tym problemu.
Po porstu musisz zdobyć adres IP maszyny docelowej i się na nią łączysz. Tak samo jak w grze podajesz adres IP servera i koniec. Nie wiadomo o co chodzi, narysuj diagram przepływu informacji bo z tego opisu wynika chaos.
To może inaczej, po wpisaniu u mnie na kompie
C:\Users\admin>route print
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.88.1 192.168.88.214 25
0.0.0.0 0.0.0.0 192.168.200.1 192.168.200.86 60
127.0.0.0 255.0.0.0 On-link 127.0.0.1 331
127.0.0.1 255.255.255.255 On-link 127.0.0.1 331
127.255.255.255 255.255.255.255 On-link 127.0.0.1 331
192.168.88.0 255.255.255.0 On-link 192.168.88.214 281
192.168.88.214 255.255.255.255 On-link 192.168.88.214 281
192.168.88.255 255.255.255.255 On-link 192.168.88.214 281
192.168.200.0 255.255.255.0 On-link 192.168.200.86 316
192.168.200.86 255.255.255.255 On-link 192.168.200.86 316
192.168.200.255 255.255.255.255 On-link 192.168.200.86 316
224.0.0.0 240.0.0.0 On-link 127.0.0.1 331
224.0.0.0 240.0.0.0 On-link 192.168.88.214 281
224.0.0.0 240.0.0.0 On-link 192.168.200.86 316
255.255.255.255 255.255.255.255 On-link 127.0.0.1 331
255.255.255.255 255.255.255.255 On-link 192.168.88.214 281
255.255.255.255 255.255.255.255 On-link 192.168.200.86 316
===========================================================================
W kolumnie Interface pecta są dwa interfejsy i dwa adresy :
eth 192.168.88.214
wifi 192.168.200.86
Teraz jeśli urządzenie z którym chcę się komunikować ma adres np 192.168.88.105 to z interfejsu ETH o adres 192.168.88.214 poleci ramka UDP inicjująca to urządzenia z zaszytym adresem 192.168.88.214.
Jeśli urządzenie ma adres 192.168.200.85 to komunikacja odbędzie się na interfejsie wifi i do urządzenia poleci ramka UDP z zaszytym adresem 192.168.200.86.
Kiedy urządzenie odbierze ramkę UDP inicjującą poprawnie, to utworzy nowy request UDP na adres zaszyty w ramce który otrzymany został przed chwilą.
Cały problem polega na wyczajeniu z którego interfejsu wychodzi request na dany IP bym wiedział jaki adres mam zaszyć w ramce inicjującej bo urządzenie na ten adres będzie wysyłać odpowiedzi.
W podanym przykładzie sprawa jest dość prosta bo urządzenie jest w tej samej podsieci i więc dla
IP urządzenia 192.168.88.105 -> ramka inicjująca musi zawierać IP 192.168.88.214 będzie działać bo urządzenie ma adres w tej samej sieci co PC więc będą sie widzieć natomiast gdy do ramki inicjującej wrzucić adres WFII 192.168.200.86 to nie będzie komunikacji.
Analogicznie gdyby było na odwrót:
IP urządzenia 192.168.200.86 -> ramka inicjująca musi zawierać IP 192.168.200.85 - będzie działać
IP urządzenia 192.168.200.86 -> ramka inicjująca gdy będzie zawierać IP 192.168.88.214 - nie będzie działać
Chodzi o wyczajenie z którego interfejsu wyjdzie żądanie do zadanego IP.
Request do 192.168.88.105 wyjdzie z eth0 z adresu 192.168.88.214, request do 192.168.200.86 wyjdzie z Wifi z adresu 192.168.200.85.
Chodzi teraz o jak kodem w delphi sprawdzić z jakiego adresu/interejsu wyjdzie request po zadaniu mu jakiegoś IP.
W trudniejszym przypadku będzie tak, że np po uruchomieniu Openvpn pojawią się dodatkowe wpisy w tablicy routingu, takie że ruch do adresu np 10.0.0.1 ma iść przez interfejs VPN 10.0.100.6 (maska 255.255.255.0) co jak widać nie spełnia warunku adres*maska= ten sam adres sieci.
Przykład takiej konfiguracji:
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.88.1 192.168.88.31 25
0.0.0.0 0.0.0.0 10.100.100.5 10.100.100.6 5025
10.100.0.0 255.255.255.0 10.100.100.5 10.100.100.6 281
10.100.100.0 255.255.255.0 On-link 10.100.100.6 281
10.100.100.6 255.255.255.255 On-link 10.100.100.6 281
10.100.100.255 255.255.255.255 On-link 10.100.100.6 281