windows - Kommuniker til offentlig IP fra et lokalt netværk (WinSock, C)

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg er ny på dette forum (i det mindste ved at stille spørgsmål), så vær så tålmodig. Jeg forsøger at skrive simple klient-server applikationer til at kommunikere ved hjælp af datagram (UDP) stikkontakter, med C og Windows.


Scenariet er meget enkelt, jeg vil gerne kunne sende/modtage data fra en maskine i nogle lokale netværk (bag en GATEWAY/NAT) til en vært med offentlig IP. Jeg kan sende dataene, men det forekommer umuligt at modtage data tilbage, fordi den eksterne server ikke kan se klientens lokale IP.


Jeg vil ikke have brugeren at udføre manuel port forwarding på GATEWAY, og jeg vil heller ikke bruge UPnP på grund af sikkerhedsproblemer (selv om det også skal aktiveres af brugeren).


Jeg tror det er muligt, fordi applikationer som Skype eller Browsers kan gøre det, men hvordan?
Er der nogen, der automatisk videresendes havne eller lignende? Jeg er udmattet med at søge på internettet ... HJÆLP!

Bedste reference


For UDP-forbindelser skaber de fleste hjemme NAT-gateways automatisk en midlertidig omvendt kortlægning for hver udgående pakke.


Overvej et scenario, hvor din klient kører på den interne maskine med IP-adresse 192.168.4.5, sender en UDP-pakke fra port 65000 til den eksterne adresse 64.34.119.12:6789 via en gateway med ekstern IP-adresse [[192.0.43.10. Når gatewayen ser din interne klient sende en UDP-pakke fra 192.168.4.5:65000 til den eksterne adresse, vil den NAT det til en ekstern adresse og port, som 192.0.43.10:5500. Din server vil se en pakke med en kildeadresse på 192.0.43.10:5500 og destinationsadresse 64.34.119.12:6789. Routeren opretter også en omvendt kortlægning, så hvis den ser en pakke ankomme på den eksterne grænseflade med en kilde på 64.34.119.12:6789 og en destination på 192.0.43.10:5500, vil den omdirigere den tilbage til 192.168.4.5:65000]]. Denne kortlægning går typisk ud efter en kort periode.


Det betyder, at i simple tilfælde er alt du skal gøre, at:



  1. På klienten skal du bruge den samme port til at sende til serveren og lytte efter svar;

  2. På serveren skal du svare på klienten på den adresse og den port, som klientens pakke blev modtaget fra, ved hjælp af den samme serverport, der modtog pakken.

  3. Har klienten sendt den oprindelige pakke i samtalen;

  4. Lad ikke 'forbindelsen' gå i tomgang i mere end et par minutter ad gangen.