Я пытаюсь реализовать в программном обеспечении функцию пробивки отверстий. Дело в том, что я реализую это с уже сделанным TCP-сервером для связи с Пользователями.
Вот что я до сих пор:
- "A" отправляет сообщение на UDP-сервер "US" (на порт 9333)
- "US" отправляет обратно "A" к порту, к которому он подключен (порт 31000 - локальный порт 31005)
- "A" отправляет сообщение на TCP-сервер "TS", говоря, что он хочет подключиться к B (и передать порт 31000).
- "TS" отправляет сообщение "B" , давая ему порт "A" (31000) и ip
- "B" отправляет сообщение "США" (на порт 9333)
- "US" отправляет сообщение "B" , сообщая ему свой порт 45000 (localport 45005).
- "B" отправляет сообщение "TS", давая udp-порт (45000)
- "TS" отправляет сообщение "A" , дающее B udp-порт (45000) и ip
- "A" начать отправку сообщения udp в B ip на порт 45000 и прослушать локальный порт 31005
- "B" начать отправку сообщения udp в ip на порт 31000 и прослушивать локальный порт 45005
Конечно, порты 31000, 31005, 45000 и 45005 здесь, например, каждое новое соединение, которое изменяется порт, только 9333 статично.
Я знаю, что много назад и вперед, больше, чем должно быть на самом деле. Дело в том, что я обязан использовать TCP-сервер для взаимодействия с обоими пользователями, udp-сервер находится здесь, чтобы вернуть пользовательский порт себе, чтобы он мог отправить его обратно на TCP-сервер.
Однако сообщения между пользователями не принимаются никакими... У кого-нибудь есть идея, почему?
EDIT:
Я тестировал свой маршрутизатор с http://nattest.net.in.tum.de/test.php, и удары отверстий в отверстиях udp отлично работают, поэтому проблема не возникает из моего маршрутизатора, но из мой протокол...
Когда пользователи находятся за одним и тем же NAT, все работает нормально, конечно, он использует private-ip, но это значит, что код тоже работает, поэтому каждый из них приводит к проблеме протокола...
ИЗМЕНИТЬ 2:
Собственно, я сделал это наполовину (И проблема исходила из моего кода, а не протокола... Я подключил 2 пользователя, один в 3G с iPhone, один за моим NAT на Wi-Fi.
Самое смешное (не так много), что только один сокет мог получать и отправлять данные между обоими пользователями. (сокет, инициированный iphone). Согласно протоколу, у меня должно быть 2 хорошо соединенных сокета, я не прав?
Поэтому мне удалось пробить дыру в моем NAT, но на самом деле не в сотовом NAT.
Конечно, я протестировал сразу 2 iphones, подключенных в 3G. И никто не получает сообщение от другого.
Я пропустил что-то про сотовый NAT?
P.S.: Извините за обновление моего вопроса, но поскольку я не получаю ответа, я пытаюсь найти сам...
P.S. 2: Поскольку мне удалось пробить дыру в моем NAT, я изменил заголовок, добавив "на 3G"
РЕДАКТИРОВАТЬ 3: я снова проверил http://nattest.net.in.tum.de/test.php с моим компьютером, подключенным к Интернету через мой iphone 3G соединение.
Здесь результат:
По всей видимости, все испытания на ударопрочность отверстий udp были успешными на 9-м испытании.
Далее кажется:
Тест связывания UDP (?): независимая привязка к конечной точке, предсказание порта легко
Таким образом, не должно быть никаких проблем с подключением 2 пэров через 3G-соединение (ну не так много, как за "домашним" NAT). Правильно?
РЕДАКТИРОВАТЬ 4:
Чтобы быть уверенным, теперь я отправляю сообщение на два разных UDP-сервера, чтобы проверить, являются ли порт и локальный порт одинаковыми для 3G.
Короче говоря, порты (локальные и общедоступные) одинаковы при подключении на обоих серверах. поэтому тест, выполненный на EDIT 2, был правильным, udp является независимым от конечной точки, поэтому не должно быть никаких проблем с удалением отверстий, я думаю... (По крайней мере, с моим провайдером)