Я написал программу, которая устанавливает одноранговые ссылки. Программа, которую можно найти по адресу http://basyl.co.uk/code/punch/doc/files/Readme-txt.html,, состоит из двух частей: сервер, работающий на общедоступном хосте; и клиент, который используется каждым концом желаемой одноранговой ссылки.
У меня есть доступ к двум общедоступным серверам: bonn (home.contextshift.co.uk) и entropy (home2.contextshift.co.uk)
Если сервер работает на bonn, а клиенты работают на bonn, entropy и моем домашнем ПК (за NAT), перфорированное соединение от entropy может без проблем общаться с моим ПК. Однако соединение Бонна с ПК не удается; данные с ПК доходят до Бонна, но данные из Бонна через NAT-дыру никогда не поступают.
Если сервер находится на энтропии и снова, клиенты работают на bonn, entropy и моем ПК, перфорированные соединения работают нормально между всеми клиентами.
Это сбивает с толку, поскольку сервер не участвует в одноранговом потоке данных. Если вы все еще со мной, вот поток:
- Клиент-А подключается к серверу по каналу TCP и получает уникальный токен;
Клиент-B подключается к серверу по каналу TCP и получает уникальный токен;
Клиент-A и клиент-B получают обновления по своей TCP-ссылке, сообщая, кто еще подключен;
Клиент-A (или B) отправляет запрос на сервер по вновь созданному каналу UDP, передавая его токен и имя клиента-B;
Сервер идентифицирует Клиента-А по токену и перенаправляет запрос Клиенту-В по своей TCP-линии, включая UDP-адрес / номер порта А в запросе;
Клиент-A (или B) отправляет подтверждение на сервер по вновь созданному каналу UDP, передавая его токен и имя клиента-A;
Сервер идентифицирует Клиента-B по токену и перенаправляет запрос Клиенту-А по своей линии TCP, включая UDP-адрес / номер порта B в запросе;
A и B теперь имеют UDP-адрес / порт другого и могут пинговать друг друга и обмениваться данными.
Как видите, Сервер никогда не общается по ссылкам UDP, созданным Клиентами для своих запросов, только по ссылкам TCP.
Итак, в итоге, клиент не работает на определенном хосте, когда сервер находится на том же хосте. Какие-нибудь предложения по причинам такого поведения или по способам, которыми я мог бы исследовать это далее?
Обратите внимание, что этот тест является искусственным, потому что цель пробивания дырок заключается в том, чтобы общаться между двумя хостами, оба за NAT. Это на самом деле работает, где бы ни находился сервер, поэтому проблему можно считать академической.
Обратите внимание, что перед написанием программы я попытался использовать общедоступное приложение под названием NatCheck. Это также не помогло подобным образом, хотя я не исследовал это много - потребовалось три общедоступных хоста, и я изменил его, чтобы использовать только мои два. Когда это не сработало, я предположил, что я каким-то образом облажался и отказался от приложения.
Любые комментарии к коду также приветствуются (вероятно, я опубликую их на сайте обзора кода).