Как я могу получить внешний IP-адрес с NSHost?
Я пытаюсь найти свой внешний IP-адрес, но за NAT я получаю только локальные.
NSArray *addresses = [[NSHost currentHost] addresses];
Есть ли способ распечатать публичный адрес? Использование NSHost это хорошая идея?
3 ответа
Не всегда может быть надежный способ получить ваш публичный 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];
Если вам когда-нибудь придется взглянуть на диаграмму топологии сети для крупной организации, сделайте это. Это поучительно. Весь смысл NAT, брандмауэров и всей этой "черной магии" состоит в том, чтобы позволить сети управлять адресами (включая защиту вас) без вашего ведома.
Есть только три способа, с помощью которых я смог надежно (и здесь под надежной относительной концепцией) получить внешний IP-адрес сервера.
Во-первых, сами боги сети (и при обращении к ним обращайтесь к ним как к богам, это поможет вам в получении информации). Иногда (не всегда) это простое сопоставление старших байтов вашего IP-адреса с сохранением младших байтов. Иногда это более сложно, но все еще следует правилам, которые вы можете использовать. Просто имейте в виду, что эти правила могут измениться в любое время.
Во-вторых, за пределами вашей сети должен быть ящик, к которому вы можете обратиться, и он, в свою очередь, может сообщить вам ваш IP-адрес.
Третий - специально подключаться к внешнему DNS-серверу (а не к вашему корпоративному) для получения информации.
Конечно, вам следует усомниться в необходимости знать ваш внешний IP-адрес. Весь смысл DNS состоит в том, чтобы не беспокоиться об IP-адресах и просто ссылаться на машины по доменным именам.
Не существует надежного способа получить ваш публичный IP. В зависимости от топологии вашей сети вы не сможете зависеть от исходящего адреса по ряду причин: пулы IP-адресов, динамические маршруты, несколько уровней NAT, прокси-серверы и т. Д.