Связь с публичным IP из локальной сети (WinSock, C) - PullRequest
0 голосов
/ 30 августа 2011

Я новичок в этом форуме (по крайней мере, задаю вопросы), поэтому, пожалуйста, будьте терпеливы. Я пытаюсь написать простые клиент-серверные приложения для связи через дейтаграммы (UDP), с C и Windows.

Сценарий очень прост, я хочу иметь возможность отправлять / получать данные с машины в какой-то локальной сети (за GATEWAY / NAT) на некоторый хост, имеющий публичный IP. Я могу отправить данные, но кажется невозможным получить какие-либо данные обратно, потому что удаленный сервер не может видеть локальный IP-адрес клиента.

Я не хочу, чтобы пользователь выполнял ручную переадресацию портов на GATEWAY, и я также не хочу использовать UPnP из-за проблем безопасности (хотя он также должен быть включен пользователем).

Я думаю, что это возможно, потому что такие приложения, как Skype или браузеры, могут это делать, но как? Существуют ли автоматически перенаправленные порты или тому подобное? Я устал от поиска в Интернете ... ПОЖАЛУЙСТА, ПОМОГИТЕ!

1 Ответ

3 голосов
/ 31 августа 2011

Для соединений UDP большинство домашних шлюзов NAT автоматически создают временное обратное сопоставление для каждого исходящего пакета.

Рассмотрим сценарий, в котором ваш клиент работает на внутренней машине с IP-адресом 192.168.4.5, отправляя пакет UDP из порта 65000 на внешний адрес 64.34.119.12:6789 через шлюз с внешним IP-адресом 192.0.43.10. Когда шлюз видит, как ваш внутренний клиент отправляет пакет UDP с 192.168.4.5:65000 на внешний адрес, он отправляет NAT на внешний адрес и порт, например 192.0.43.10:5500. Ваш сервер увидит пакет с адресом источника 192.0.43.10:5500 и адресом назначения 64.34.119.12:6789. Маршрутизатор также устанавливает обратное сопоставление, поэтому, если он видит, что пакет поступает на внешний интерфейс с источником 64.34.119.12:6789 и пунктом назначения 192.0.43.10:5500, он перенаправляет его обратно на 192.168.4.5:65000. Это сопоставление обычно истекает через некоторое время.

Это означает, что в простых случаях все, что вам нужно сделать, это:

  1. На клиенте используйте тот же порт для отправки на сервер и прослушивания ответов;
  2. На сервере ответьте клиенту по адресу и порту, с которого был получен пакет клиента, используя тот же порт сервера, который получил пакет;
  3. Пусть клиент отправит начальный пакет в разговоре;
  4. Не оставляйте «соединение» бездействующим более нескольких минут за один раз.
...