Клиент-Сервер через интернет - C#
Формулировка задачи:
Собственно проблема довольно распространённая
- Между ПК и интернетом стоит роутер
- Серверное приложение на ПК открывает порт
- из-за роутера нет доступа к данному порту из вне
Вот код до момента прослушивания порта
Да конечно можно пробросить порты через роутер, но в случае роспростронения ПО,
не всякому пользователю захочется копатся в настройках маршрутизаторов
Очень заинтересовало ПО uTorrent
-захожу на сайт (не реклама)http://portscan.ru чтоб проверить открыт ли порт 20903
-результат: порт закрыт
-запускаю uTorrent, в помощнике настройки, проверяю на самом деле ли 20903 исплльзует
-проверяю снова порт и ОПА он открыт
-закрывю uTorrent и соответственно закрывается порт
Скажите пожалуйста каким образом это делает uTorent и как это можно реализовать в С#
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); //Начинаем слушать соединение
Всё нашел решение!
помогла данная статья:
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");
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д