Добавьте сопоставление NAT UPnP в сложной сети, используя C # - PullRequest
3 голосов
/ 29 августа 2011

Я создаю приложение, которое прослушивает соединения (сервер) из другого приложения (клиента) через TCP-соединение.Так что, если оба приложения находятся в одной сети, установить соединение будет легко.поэтому я пытаюсь добавить метод на сервер, чтобы пользователям не приходилось открывать порты на своих маршрутизаторах, чтобы приложение работало при использовании его через Интернет.поэтому позвольте мне показать вам несколько различных сценариев:

1) --------------------------------------------------- SCENARIO_1 -------------------------------------------------------------

сервер - это компьютер в доме.Этот компьютер подключен к маршрутизатору, а этот маршрутизатор подключен к Интернету.Клиент - это компьютер в офисе, который также имеет доступ к Интернету.

, чтобы этот сценарий работал, прежде чем я использовал для открытия портов на домашнем маршрутизаторе и перенаправления их на серверный компьютер.на клиенте мне просто нужно было указать правильный IP-адрес и тот же порт, чтобы установить соединение.

теперь я избегал открывать порты на домашнем маршрутизаторе по-настоящему крутой техникой:

сначала я добавляю эту ссылку:

enter image description here

затемЯ сообщаю маршрутизатору, какие порты я хочу перенаправить на мой компьютер (сервер):

    NATUPNPLib.UPnPNATClass upnpnat;
    NATUPNPLib.IStaticPortMappingCollection mappings;

    public ServerExample()
    {
        InitializeComponent();

        //                           server local IP address
        mappings.Add(1300, "TCP", 1300, "192.168.0.120", true, "my server");
        //.... etc
       ..

при этом я могу подключиться со своего офисного компьютера, предоставив порт 1300, IP-адрес WANсерверный компьютер, который является другим.(этот адрес можно найти по адресу: whatismyipaddress.com). ОХЛАЖДЕНИЕ - ЭТО ТО, ЧТО Я НЕ ДОЛЖЕН ДЕЛАТЬ ЛЮБОЙ КОНФИГУРАЦИИ НА МАРШРУТИКЕ !!!

2) ----------------------------------------------- SCENARIO_2 ----------------------------------------------

знаю, тут возникает моя проблема.Сервер находится в офисе.этот сервер подключен к маршрутизатору A, маршрутизатор A подключен к маршрутизатору B, а маршрутизатор B подключен к Интернету.В остальном этот пример похож на последний пример на сервере с дополнительным маршрутизатором между ними.а клиент где-то ещенам все равно, как настроена сеть на клиентском компьютере, если у него есть доступ к интернету.

способ, который я использовал для решения этой проблемы, заключался в пересылке пакетов с маршрутизатора x на серверный компьютер, а также перенаправлении трафика с порта x маршрутизатора B на ip-адрес маршрутизатора A. при настройке этой конфигурацииМне удалось установить соединение с клиентом при предоставлении IP-адреса WAN сервера.(IP-адрес, который отображается по адресу: whatismyipaddress.com при извлечении из сети офиса).

, поэтому было бы неплохо, если бы я мог избежать всей этой конфигурации на маршрутизаторах и сделать что-то похожее на:

    public delegate void SomeDelegate(string parameters);

    NATUPNPLib.UPnPNATClass upnpnat;
    NATUPNPLib.IStaticPortMappingCollection mappings;

    public ServerExample()
    {
        InitializeComponent();

        //                           server local IP address
        mappings.Add(1300, "TCP", 1300, "192.168.150.141", true, "my server");
        mappings.Add(1300, "TCP", 1300, "another ip", true, "router's ip");

, поэтому я поиграл с этим и не смог заставить его работать.также было бы хорошо, если бы я мог выяснить, является ли подключение к серверу сценарием 1 с c # или сценарием 2 или, возможно, другим сценарием, чтобы пользователям, настраивающим сервер, не приходилось указывать всю эту информацию.Например, я уверен, что LimeWire делает нечто подобное.


Редактировать:

здесь показан сценарий 1:

enter image description here

, а здесь показан сценарий 2

enter image description here

1 Ответ

4 голосов
/ 30 августа 2011

Используемая вами функция называется Universal Plug and Play (UPnP) , которая в основном позволяет устройству сообщать другому устройству, как с ним связаться.То, что вы делаете, говорит компьютеру, чтобы он сообщал маршрутизатору, какие порты вы хотите перенаправить на него.К сожалению, UPnP - это не маршрутизируемый протокол, что означает, что он не может перепрыгивать через маршрутизаторы.Таким образом, краткий ответ заключается в том, что выполнение того, что вы пытаетесь , не будет работать с несколькими маршрутизаторами без ручной настройки наиболее удаленных от клиента.можно было бы что-то сделать с протоколом устройства шлюза Интернета (IDG) , но вам придется исследовать это больше, а библиотека, на которую вы ориентируетесь, не поддерживает это.Отправьте этот вопрос на Ошибка сервера , и вы можете получить лучший ответ.(Не публикуйте свой код, просто объясните основы вашей проблемы, что вы пытаетесь заставить машину зарегистрироваться на маршрутизаторе, используя работающий UPnP, но перед вами есть другой маршрутизатор, который вы хотите автоматически пересылатьтоже.)

...