В настоящее время я выполняю приложение p2p (UDP) в C, используя метод «дырочной штамповки». Я нашел действительно иллюстрирующую предыдущие записи Дж. Селби, где он объясняет основы и продолжал соответственно (post1, post2), но, вероятно, я что-то пропустил, и только один из сверстников получает данные, а другой - нет.Приложение P2P, пробивка отверстий не работает для независимого отображения точки доступа NAT
Вот шаги, которые я принимаю:
установка: Один из узлов подключен к сотовому ключу 4G (NAT A), а другой подключен к маршрутизатору, который идет к провайдеру провайдера (NAT B). Это результаты, полученные для stunclient (клиент каскадера) для обоих NAT.
NAT A: Binding test: success Local address: X1:48383 Mapped address: Y1:28265 Behavior test: success Nat behavior: Endpoint Independent Mapping Filtering test: success Nat filtering: Address and Port Dependent Filtering NAT B: Binding test: success Local address: X2:49158 Mapped address: Y2:49158 Behavior test: success Nat behavior: Endpoint Independent Mapping Filtering test: success Nat filtering: Address and Port Dependent Filtering
Теперь, согласно этим результатам, это мое понимание, что оба NATs имеют разумное поведение и перфорирования может добиться успеха (обратите внимание, что NAT А не делать сохранение порта).
- перфорация попытка: Оба клиента связаться с сервером общественного облицовочного (STUN/Rendezvous) с помощью UDP обнаружить/обмен IP: пары портов. Когда каждый из клиентов получает ответ от сервера, они отправляют дейтаграмму UDP на другой одноранговый узел (ip: порт, как видно на связанном публичном сервере), а затем приступают к отправке еще нескольких сообщений и получают ответ и отправляют сообщение на адрес из которого он пришел. Я отправляю дейтаграммы, используя тот же сокет, который связался с общедоступным сервером, только меняя порт назначения ip: порт на функцию sendto.
Дело в том, что хост за NAT A (подключенный к 4G-ключу) всегда получает сообщение и, несмотря на ответ на правильный ip и порт назначения, другой позади (NAT B) никогда не получает сообщение. Любые идеи, что я здесь отсутствует? или как диагностировать проблему?
Спасибо заранее.