Клиент-Сервер через интернет - C#

Узнай цену своей работы

Формулировка задачи:

Собственно проблема довольно распространённая - Между ПК и интернетом стоит роутер - Серверное приложение на ПК открывает порт - из-за роутера нет доступа к данному порту из вне Вот код до момента прослушивания порта
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 20903);
 
            //Создаём сокет ТСР/IP
            Socket sListener = new Socket(AddressFamily.InterNetwork,
                                          SocketType.Stream, ProtocolType.Tcp);

            //Назначаем сокет локальной конечной точке и слушаем входящие сокеты
            try
            {
                sListener.Bind(ipEndPoint);
                sListener.Listen(10);
 
                //Начинаем слушать соединение
Да конечно можно пробросить порты через роутер, но в случае роспростронения ПО, не всякому пользователю захочется копатся в настройках маршрутизаторов Очень заинтересовало ПО uTorrent -захожу на сайт (не реклама)http://portscan.ru чтоб проверить открыт ли порт 20903 -результат: порт закрыт -запускаю uTorrent, в помощнике настройки, проверяю на самом деле ли 20903 исплльзует -проверяю снова порт и ОПА он открыт -закрывю uTorrent и соответственно закрывается порт Скажите пожалуйста каким образом это делает uTorent и как это можно реализовать в С#
Всё нашел решение! помогла данная статья: http://pietschsoft.com/post/2009/02/...-via-UPnP.aspx Ну как всем наверное известно если ПК подключён к инету через роутер, то естественно весь трафик с нета идёт не на Ваш ПК, а на роутер Таким образом открой вы хоть все порты, для того чтоб получить к ним доступ через роутер необходимо их пробросить непосредственно в интерфейсе роутера У всех роутеров(исключений не встречал) есть опция "Вкл UPnP", которая позволяет средствами "Plug and Play" автоматически пробрасывать порт на заданный IP Благодаря статье (ссылка выше) Я узнал о библиотеке

NATUPnPLib

, которая оснащена ф-циями позволяющими воспользоваться UPnP на роутере, и как следствие избавить пользователя от ручной проброски портов для вашего ПО собсно пример как это работает:

(Предварительно добавляем ссылку на библиотеку NATUPnPLib, находится во вкладочке СОМ)

// Объявили класс
        NATUPNPLib.UPnPNATClass upnpnat = new NATUPNPLib.UPnPNATClass();
        // Нажимаю кнопку №1 для открытия порта
        private void button1_Click(object sender, EventArgs e)
        {
            // Открываем порт и слушаем его
            IPAddress ipAd = IPAddress.Parse("192.168.1.2");
            TcpListener listener = new TcpListener(ipAd, 20903);
            listener.Start();
            // После того как порт открыт, пробрасываем его через роутер
            NATUPNPLib.IStaticPortMappingCollection mappings = upnpnat.StaticPortMappingCollection;
            mappings.Add(20903, "TCP", 20903, "192.168.1.2", true, "Test Open Port");
            // порт доступен с интернета
        }
        // кнопка №2 закрывает проброску через роутер
        private void button2_Click(object sender, EventArgs e)
        {            
            NATUPNPLib.IStaticPortMappingCollection mappings = 
                        upnpnat.StaticPortMappingCollection;
 
            mappings.Remove(20903, "TCP");
        }

Решение задачи: «Клиент-Сервер через интернет»

textual
Листинг программы
    NATUPNPLib::UPnPNATClass^ upnpnat = gcnew NATUPNPLib::UPnPNATClass();    
    NATUPNPLib::IStaticPortMappingCollection^ mappings = upnpnat->StaticPortMappingCollection();
    mappings->Add(1234, "TCP", 1234, "192.168.0.102", true, "test");

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.375 из 5