@rchbtch

Почему UDP Hole Punching не всегда обходит NAT?

Данный код позволяет делать p2p между пользователями, но бывает работает через раз. Тестили с другом, все работает прекрасно. Но как только он пытается сделать тоже самое с другим пользователем, все перестает работать. Может разные типы NAT или еще чего.
Сама программа подключается к STUN-серверу и получает публичные ip. Потом при подключении через сторонний сервеp (используем текстовые сообщения jabber) делаем инициализацию и обмен ip между пользователями. Но что-то идет не так(
switch (data.com)
{
case "Call":
   if (MessageBox.Show("Звонок от " + msg.From.Bare, "Входящий", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
   {
   //Была нажата кнопка “Yes”
      string ipp = data.data;  //Получает ip вызывающего пользлвателя
      userEndPoint = new IPEndPoint(IPAddress.Parse(ipp.Substring(0, ipp.IndexOf(":"))),
                                    Convert.ToInt32(ipp.Substring(ipp.IndexOf(":") + 1)));
      UDPMess(); //Отправляем ему UDP пакет
      To = msg.From;
      SentTo(Command.Yes, myEndPoint, msg.From); //Сообщаем серверу что мы ожидаем пользователя и свой ip
      StartVoice(); //Начинаем передачу голоса
   }
   else
   {
      SentTo(Command.No, null, msg.From); //Сообщаем серверу об отказе
   }
   break;
case "Yes":
   //Происходит, если пользователь согласился на передачу и ожидает отклика
   //Все тоже самое только для инициирующей передачу стороны
   string ip = data.data;
   userEndPoint = new IPEndPoint(IPAddress.Parse(ip.Substring(0, ip.IndexOf(":"))),
                                Convert.ToInt32(ip.Substring(ip.IndexOf(":") + 1)));
   UDPMess();
   To = msg.From;
   StartVoice();
   MessageBox.Show("Пользователь " + msg.From.Bare + " принял вызов");
   break;
}
  • Вопрос задан
  • 1604 просмотра
Пригласить эксперта
Ответы на вопрос 2
Jump
@Jump
Системный администратор со стажем.
  • Во первых NAT бывает разный, и не со всеми видами этот фокус прокатит.
  • Во вторых зачастую клиенты сидят за двойным NAT'ом - провайдера и свой на роутере.
  • В третьих банальный файервол может резать.
Ответ написан
Комментировать
Neuroware
@Neuroware
Программист в свободное от работы время
Насколько я помню есть так называемый симметричный NAT, и Hole Punching через него не работает. А так если в 1 случае работает то единственное что может мешать в другом это провайдер или firewall
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы