Клиент-Сервер через интернет - 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");