Простая TCP-связь с компьютером за маршрутизатором

Я пишу пульт дистанционного управления С# для своего медиаплеера. Он работает на моем телефоне Android.

У меня есть клиентское приложение, прослушивающее TCP-соединения на моем компьютере, которое, когда одно соединение установлено, обрабатывает команды (увеличение громкости, уменьшение громкости, ...). Я протестировал эту часть с помощью telnet 127.0.0.1 на своем компьютере, и она отлично работает.

С подключением с телефона все сложнее, так как он не в той же сети (у меня нет Wi-Fi, только проводное подключение), поэтому я не знаю, как действовать дальше. В основном я хочу подключиться к компьютеру, который находится за маршрутизатором.

Должен ли я разместить TCP-сервер на своем телефоне и подключить к нему ПК? Возьмем, к примеру, IRC: хотя я и нахожусь за маршрутизатором, я могу подключаться к внешним серверам без переадресации портов. Или, если размещение сервера на моем компьютере подходит, как мне к нему подключиться?

Я еще не все понимаю в этом, поэтому не стесняйтесь поправлять меня, если я что-то не так.


person Clément    schedule 04.03.2012    source источник
comment
У меня есть клиентское приложение, прослушивающее TCP-соединения... Я думаю, вы имеете в виду серверное приложение. Клиенты подключаются к серверам, серверы ждут подключения. :)   -  person Some programmer dude    schedule 05.03.2012


Ответы (2)


С подключением с телефона все сложнее, так как он не в той же сети (у меня нет Wi-Fi, только проводное подключение), поэтому я не знаю, как действовать дальше. В основном я хочу подключиться к компьютеру, который находится за маршрутизатором.

То, чего вы хотите достичь, возможно, но вам нужно узнать об обходе NAT и пробивке отверстий.

Чаще всего устройства за NAT/маршрутизатором имеют частный IP-адрес, действительный только в локальной сети. Удаленные устройства не могут догадаться об этом. Этот частный адрес преобразуется NAT в общедоступный IP-адрес, когда устройство хочет связаться с глобальной сетью.

Простое решение — дать общедоступный IP-адрес устройству за NAT. В этом случае удаленные устройства в глобальной сети легко смогут получить к нему доступ, потому что его адрес общедоступен.

person Jérôme Verstrynge    schedule 15.03.2012
comment
Так как же дать общедоступный IP-адрес устройству за NAT? - person Trilarion; 15.10.2016

Было бы логичнее оставить сервер на ПК, а маршрутизатор настроить на переадресацию соединений на ваш ПК. У вас есть два варианта:

  • Установите DMZ: все входящие соединения на маршрутизаторе будут перенаправлены только на один ПК. Это проще всего, когда у вас есть только 1 компьютер в сети, который должен принимать соединения.
  • Настройте переадресацию портов: вы можете указать маршрутизатору переадресовывать входящие соединения на порт X к IP-адресу Y на порту Z. Таким образом, несколько ПК могут отображать соединения (используя разные порты на маршрутизаторе). Это также немного более безопасно.

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

person Konerak    schedule 04.03.2012
comment
Но как работают IRC-соединения? Почему мне не нужна переадресация портов для IRC? (Или даже HTTP?) - person Clément; 05.03.2012
comment
Спасибо за ваш ответ кстати. Настроил переадресацию портов, все работает корректно; но это делает приложение далеко не простым. Без проброса портов никак не обойтись? - person Clément; 05.03.2012
comment
Вам не нужна переадресация портов для IRC, потому что ваш компьютер подключается к IRC. Ваш маршрутизатор увидит, что ваш компьютер пытается подключиться, и использует NAT (преобразование сетевых адресов) для передачи возвращаемых пакетов с сервера на ваш компьютер. - person Konerak; 05.03.2012
comment
Переадресация портов — это всего лишь разовая настройка вашего маршрутизатора. Это не имеет ничего общего с приложением. Если вы хотите продать свое приложение, вы можете попытаться сделать так, чтобы сторонний хост «посредничал» в соединении... ПК подключается к веб-сайту, ваш смартфон подключается к веб-сайту, а веб-сайт пытается использовать их обоих. установить прямое соединение, а если оно не удается, продолжает посредничество в соединении. Для личного использования того, что у вас есть сейчас, должно быть более чем достаточно, не так ли? - person Konerak; 05.03.2012
comment
Верно, но если я хочу предложить приложение бесплатно, управление промежуточным сервером будет стоить денег. И мой вопрос скорее из любопытства. Спасибо за вашу помощь! - person Clément; 05.03.2012
comment
На самом деле это так, хотя просто страница «подключи меня» может быть простой PHP-страницей... ваш компьютер публикует свой IP-адрес и ключ, ваш смартфон публикует свой IP-адрес и ключ, и они оба получают IP-адрес другого. адрес. Теперь каждый может попробовать подключиться к другому — если один сработает, все уже хорошо :] - person Konerak; 05.03.2012
comment
Хм, но потом снова возникает проблема с переадресацией: вы не можете подключиться к ПК непосредственно за маршрутизатором... - person Clément; 05.03.2012
comment
Именно так, но поскольку обе стороны знают IP-адреса друг друга, они оба прослушивают соединения на своем порту A и пытаются подключиться к другой стороне на своем порту A. Выигрывает первое соединение. Так что да, телефон не сможет достучаться до ПК, но ПК дотянется до телефона. Все, что делает веб-страница, это дает IP-адреса друг друга. Впрочем, это просто идея ;] - person Konerak; 05.03.2012