Как я могу получить внешний IP-адрес с NSHost? - PullRequest
2 голосов
/ 31 мая 2009

Я пытаюсь найти свой внешний IP-адрес, но я получаю только локальные, за NAT.

NSArray *addresses = [[NSHost currentHost] addresses];

Есть ли способ распечатать публичный адрес? Использование NSHost - это хорошая идея?

Ответы [ 3 ]

11 голосов
/ 31 мая 2009

Не всегда может быть надежный способ получить доступ к общедоступному IP-адресу, но API DNSService в OS X будет использовать UPnP и / или протокол сопоставления портов NAT для получения общедоступного IP-адреса (среди прочего). Код, иллюстрирующий, как использовать C API, будет немного большим (50-60 строк), чтобы показать здесь, но есть некоторый пример кода Apple, который реализует красивую оболочку ObjC вокруг функциональности и даже предлагает пару функций для прямого возврата UInt32 и NSString представления публичного IP-адреса.

Соответствующий код находится здесь , но вам, вероятно, лучше всего просто загрузить zip-файл и включить PortMapper.h и PortMapper.m в свой проект и использовать их напрямую. Тогда все, что вам нужно сделать, это:

NSString * publicAddressString = [PortMapper findPublicAddress];
2 голосов
/ 31 мая 2009

Если вам когда-нибудь придется взглянуть на диаграмму топологии сети для крупной организации, сделайте это. Это поучительно. Весь смысл NAT, межсетевых экранов и всей этой «черной магии» состоит в том, чтобы позволить сети управлять адресами (включая защиту вас) без вашего ведома.

Есть только три способа, которыми я смог надежно (и здесь термин относительный является относительной концепцией) получить внешний IP-адрес сервера.

Во-первых, сами сетевые боги (и при обращении к ним обращайтесь к ним как к богам, это поможет вам в получении информации). Иногда (не всегда) это простое сопоставление старших байтов вашего IP-адреса с сохранением младших байтов. Иногда это более сложно, но все еще следует правилам, которые вы можете использовать. Просто помните, что эти правила могут измениться в любое время.

Во-вторых, у вас есть поле вне вашей сети, к которому вы можете обратиться, и оно, в свою очередь, может сообщить вам ваш IP-адрес.

Третье - специально подключиться к внешнему DNS-серверу (а не к вашему корпоративному серверу) для получения информации.

Конечно, вы должны спросить , что нужно , чтобы узнать ваш внешний IP-адрес. Весь смысл DNS состоит в том, чтобы не беспокоиться об IP-адресах и просто ссылаться на машины по доменным именам.

1 голос
/ 31 мая 2009

Нет надежного способа получить ваш публичный IP. В зависимости от топологии вашей сети вы не сможете зависеть от исходящего адреса по ряду причин: пулы IP-адресов, динамические маршруты, несколько уровней NAT, прокси-серверы и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...