Этот вопрос звучит для меня как трудности NAT Traversal и попыток установить одноранговое соединение через Интернет. Я наткнулся на этот вопрос, исследуя лучший способ настройки подключения к Интернету на устройстве, которое находится за брандмауэром. Я предполагаю, что устройство за брандмауэром должно инициировать соединение, что требуется приложение интернет-сервера (на общедоступном IP-адресе), по крайней мере, для управления инициированием соединения, и приложение интернет-сервера также может действовать как реле, если трудности NAT не могут быть пройдены.
http://en.wikipedia.org/wiki/NAT_traversal
http://en.wikipedia.org/wiki/Peer-to-peer
Хорошим примером этого является LogMeIn. Если приложение установлено на компьютере, который должен быть доступен через Интернет, это приложение обменивается данными с интернет-серверами LogMeIn, вы можете установить соединение с этим компьютером, инициировав его через серверы LogMeIn и подключившись к одноранговому порту. 80/443 с использованием NAT Traversal (это будет установление однорангового соединения) или путем инициирования через сервер LogMeIn и сервер LogMeIn, действующий как ретранслятор, если одноранговый узел не может быть установлен.
Обратите внимание; у вас должно быть приложение (что-то работающее) на обоих концах соединения в интернете, другого пути нет. Точно так же, как FTP, который был упомянут ранее (FTP-клиент, FTP-сервер) ... но в этом случае он является одноранговым (в основном вы пишете свой собственный клиент и сервер ... или если вам нужно использовать реле). .. Клиент - Реле - Сервер
http://en.wikipedia.org/wiki/LogMeIn
«Служба соединяет удаленный рабочий стол и локальный компьютер, используя SSL по TCP или UDP и используя методы обхода NAT для достижения однорангового подключения, когда оно доступно».
Часть, которую я не знаю, может ли реле идти в обоих направлениях; и я полагаю, что устройство за брандмауэром должно постоянно управлять открытым соединением с интернет-сервером, который является ретранслятором. Вот вопросы, с которыми я сейчас борюсь.
Кроме того, вы можете проверить этот пост.
C # байтовые потоки через TCP