Как получить мой локальный IP и порт, который находится за nat во время сеанса сокета udp? - PullRequest
0 голосов
/ 02 декабря 2011

Я делал программу пробивки отверстий nat, и мне было интересно, есть ли способ получить мой локальный порт?Я попытался использовать функцию «bind», которая, кажется, связывает публичный порт, а не порт моей машины.

В Nat я знаю частный ip: частный порт ---- mapped -> public IP: publicпорт, что я хочу знать, это частный порт, так что я могу прослушивать его для получения данных и делать свои собственные вещи о них .. Надежда прояснила себя достаточно

Ответы [ 2 ]

1 голос
/ 03 декабря 2011

bind() работает только на локальной машине. Когда у вас есть машина, работающая за NAT, вызов bind() на этой машине ограничивает частный IP / порт машины, а не публичный IP / порт NAT. Таким образом, bind(), за которым следует getsockname(), дает вам частный порт, который вы ищете, а затем listen() начинает прослушивать связанный частный IP / порт.

Чтобы обнаружить общедоступный IP-адрес / порт NAT, вы должны либо запросить сам NAT с использованием uPNP или SNMP, либо запросить внешний сайт, который должен пройти через NAT, например http://automation.whatismyip.com/n09230945.asp, http://iplookup.flashfxp.com, и т. Д.

0 голосов
/ 03 декабря 2011

Мне не слишком ясно, чего вы хотите достичь, но я постараюсь объяснить вам это.

Чтобы пройти через NAT, вы должны отправить дейтаграмму "изнутри" в"вне".Затем NAT сохраняет ассоциацию, и внешний тагет может ответить.

В только что протестированной реализации NAT отображает номер порта 1: 1 (полезно, поскольку номер порта может иметь значение в протоколе).

Тем не менее, как только вы отправили первую дейтаграмму или связались с нулевым адресом и нулевым портом, вы можете позвонить getsockadress() и получить ваш реальный внутренний адрес и порт.

Ваш коммуникационный партнер должен использовать recvfrom() для получения информации об источнике пакета.Там у вас есть «внешние» данные, где можно найти NAT.

...