Как установить соединение с сокетом через Интернет?

#.net #sockets #tcp #tcpclient #tcplistener

#.net #сокеты #tcp #tcpclient #tcplistener

Вопрос:

Я создаю две программы; «серверное» приложение (один экземпляр) и клиентское приложение (несколько экземпляров), которое подключается к серверному приложению. Между серверным приложением и клиентскими приложениями будет непрерывная (но незначительная) передача данных, но между клиентскими приложениями связи не будет.

Пока я успешно тестирую это с открытыми соединениями с сокетами между компьютерами в моей локальной сети. Итак, это означает, что я использую IP-адреса, найденные в cmd > ipconfig. Серверное приложение использует TcpListener / TcpClient. Я действительно не знаю, является ли это лучшим подключением для использования, или есть другие (?), но это все, что я узнал.

Что теперь требуется для того, чтобы это работало через Интернет? Я предполагаю, что отправлю запрос на подключение на внешний IP-адрес, но нужно ли мне вносить какие-либо более сложные изменения в запросы?

И нужно ли мне делать какие-то настройки в маршрутизаторе? Если да, то какого типа?

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

Ответ №1:

Вы можете продолжать использовать сокеты. Чтобы упростить связь с сервером, используйте имя хоста вместо IP-адреса; таким образом, сервер может свободно изменять IP-адреса без необходимости повторного развертывания клиентов.

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

Комментарии:

1. Эмм .. как / где мне настроить имя хоста?

2. Вам нужно будет получить доменное имя у регистратора доменных имен, затем настроить его так, чтобы оно указывало на IP-адрес вашего компьютера. Например, Go Daddy продает их.

3. о, я понимаю. У меня есть несколько доменов, так что, возможно, я мог бы просто настроить поддомен. Что мне делать с потенциальными проблемами брандмауэра клиентов? Получат ли они запрос на разрешение трафика, и как я гарантирую, что в таких предупреждениях будет отображаться правильное название программного обеспечения, если это возможно?

4. Если они получают запрос на что-то вроде ZoneAlarm, имя приложения должно соответствовать имени исполняемого файла их программы.

Ответ №2:

Вы могли бы использовать службу WCF вместо сокетов. У них есть дуплексные режимы и TCP / IP.

Затем вам понадобится компьютер со статическим IP, чтобы вы могли предоставлять доступ к своей службе через сеть.

Ознакомьтесь с этой статьей: http://keithelder.net/2008/01/17/exposing-a-wcf-service-with-multiple-bindings-and-endpoints /

Ответ №3:

Вы должны размещать свой tcp-сервер в демилитаризованной зоне http://en.wikipedia.org/wiki/DMZ_ (вычисления) или настройте свой маршрутизатор на выполнение NAT (переадресации портов) извне на сервер http://en.wikipedia.org/wiki/Port_forwarding

Брандмауэр на маршрутизаторе должен разрешать подключение к требуемому порту.

Вам следует прочитать руководство пользователя маршрутизатора, если вы не уверены, что вы делаете в настройках.