UDP дырокол пробивая хост-специфический сбой

Я написал программу, которая устанавливает одноранговые ссылки. Программа, которую можно найти на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 никогда не поступают.

Если сервер находится на энтропии и снова, клиенты работают на бонне, энтропии и моем ПК, перфорированные соединения отлично работают между всеми клиентами.

Это сбивает с толку, так как сервер не участвует в одноранговом потоке данных. Если вы все еще со мной, вот поток:

Клиент-А подключается к Серверу по каналу TCP и получает уникальный токен;

Клиент-B подключается к Серверу по каналу TCP и получает уникальный токен;

Client-A и Client-B получают обновления по своей TCP-ссылке, сообщая им, кто еще подключен;

Клиент-A (или B) отправляет запрос на сервер по вновь созданному каналу UDP, передавая его токен и имя клиента-B;

Сервер идентифицирует Клиента-А по токену и перенаправляет запрос Клиенту-В по своей линии TCP, включая адрес / номер порта А в запросе;

Клиент-A (или B) отправляет подтверждение на сервер по вновь созданному каналу UDP, передавая свой токен и имя клиента-A;

Сервер идентифицирует Клиента-B по токену и перенаправляет запрос на Клиента-А по своей линии TCP, включая адрес / номер порта B в запросе;

A и B теперь имеют UDP-адрес / порт другого и могут пинговать друг друга и обмениваться данными.

Как видите, Сервер никогда не общается по UDP-ссылкам, созданным Клиентами для своих запросов, только по TCP-ссылкам.

Итак, в итоге, клиент не работает на определенном хосте, когда сервер находится на том же хосте. Какие-либо предложения по причинам такого поведения или по способам, которыми я мог бы исследовать это дальше?

Обратите внимание, что этот тест является искусственным, потому что цель дырокола заключается в том, чтобы общаться между двумя хостами, оба за NAT. Это на самом деле работает, где бы ни находился сервер, поэтому проблему можно считать академической.

Также обратите внимание, что перед написанием программы я попытался использовать общедоступное приложение под названием NatCheck. Это также не помогло подобным образом, хотя я не исследовал это много - потребовалось три общедоступных хоста, и я изменил его, чтобы использовать только мои два. Когда это не сработало, я предположил, что я каким-то образом облажался и отказался от приложения.

Любые комментарии к коду также приветствуются (я, вероятно, опубликую его на сайте обзора кода).

Ответы на вопрос(3)

Ваш ответ на вопрос