Я хочу программно получить IP-адрес своего iPad. Как я могу запросить сетевую подсистему, чтобы узнать, какие у меня адреса IPv4 (и IPv6)?
PS: Можно как-нибудь отключить IPv6?
ios
macos
ip-address
ipv6
Уилбур
источник
источник
Ответы:
Следующий код находит все адреса IPv4 и IPv6 на устройстве iOS или OSX. Первый
getIPAddress
метод действует более или менее как старый код в этом ответе: вы можете предпочесть адрес одного или другого типа, и он всегда предпочитает WIFI сотовой сети (очевидно, вы можете это изменить).Что еще более интересно, он может возвращать словарь всех найденных адресов, пропуская адреса для
not up
интерфейсов или адреса, связанные сloopback
. Предыдущий код, а также другие решения по этой теме не будут правильно декодировать IPv6 (inet_ntoa не может с ними справиться). На это мне указал Йенс Альфке на форуме Apple - правильная функция для использования - это inet_ntop (посмотрите страницу руководства или обратитесь к этому inet_ntop руководства статью также предоставленную Йенсом.Ключи словаря имеют вид «интерфейс» / «ipv4 или ipv6».
EDIT1: код обновлен 16 мая 2014 г. (ошибка, указанная lhunath, см. Комментарии). Адреса обратной связи теперь возвращаются, но вы можете легко раскомментировать тест, чтобы исключить их самостоятельно.
РЕДАКТИРОВАТЬ2: (неизвестным лицом): Улучшено еще 13 марта 2015 г .: в случае, если пользователь использует VPN (независимо от Wi-Fi или сотовой связи), предыдущий код не сработал. Теперь он работает даже с VPN-подключениями. VPN-соединениям отдается приоритет над WiFi и Cell, потому что устройство обрабатывает их именно так. Это должно работать даже для Mac, поскольку VPN-соединение на Mac также использует IF utun0, но не проверено.
EDIT3: (9/8/2016) Учитывая проблемы, с которыми столкнулся @Qiulang (см. Комментарии) с кодом VPN (который кто-то добавил), я закомментировал это. Если кто-то точно знает, как указать VPN пользователя, пожалуйста, оставьте комментарий.
источник
addr
становится NULL? мои пользователи иногда получают NULL. вы знаете, какие возможные причины?AF_INET
для проверки. могло быть это?В вашем файле реализации .m,
источник
Многие существующие решения рассматривают только беспроводные интерфейсы, которые не работают для проводных подключений через адаптер Ethernet (т. Е. Без Wi-Fi или 3G); см. это более новое решение, которое также учитывает IP-адреса, полученные через проводные интерфейсы.
iPad: как получить IP-адрес программным способом (не по беспроводной сети)
источник
Получите IP-адрес с помощью Swift 3:
источник
Текущее решение не возвращает устройство en0 в OS X, следующий код использует структуру конфигурации системы для получения интерфейсов, а затем использует стандартные функции C для получения IP-адреса.
источник
Этот ответ был вдохновлен ответом @DavidH. Я исправил некоторые проблемы, замененные
inet_ntop
наgetnameinfo
которые позволяют более чистый подход. Обратите внимание, что это дает словарь, который отображает имя интерфейса на массив IP-адресов (технически интерфейс может иметь несколько связанных с ним IPv4 и IPv6). Он не делает различий между IPv4 и IPv6:источник
strf
- это вспомогательная функция в вашем коде?err
иstrf
. Вы можете просто заменитьstrf
на-stringWithCString:encoding:
.err
этоNSLog
оболочка, которая также выводит файл и строку. github.com/Lyndir/Pearl/blob/master/Pearl/…Ответ @ DavidH работает нормально, пока я не получил этот результат из какой-то сотовой сети 4G:
Я не использую vpn, поэтому понятия не имею, почему у меня был utun0 / ipv6.
--- Обновлено ---
Я продолжил отладку этой проблемы и обнаружил, что могу получить поддельный адрес vpn даже в других сетях 4G (это ошибка iOS ??),
Если бы я использовал vpn, я бы получил следующее:
Так что это utun1 НЕ utun0
Не разбираясь, почему мне просто придется сбросить проверку vpn :(
---- Обновить ----
Я сообщил об ошибке (28131847) в Apple и ответил: «Не все интерфейсы utun предназначены для VPN. Существуют и другие функции ОС, которые используют интерфейсы utun».
Но когда я спросил, как получить действующий IP-адрес vpn, их ответ был довольно разочарован: «Вы можете зайти в Настройки -> VPN и посмотреть на свою конфигурацию VPN, чтобы увидеть, активен ли VPN. В некоторых случаях вы можете увидеть там же назначен IP-адрес. Сейчас мы закрываем этот отчет об ошибке ". :(
---- обновление 2016/11/04 ----
Я снова столкнулся с проблемой, и мне нужно дополнительно изменить ответ @DavidH, чтобы исправить это:
Я был в сети 4G и получил этот адрес:
С его исходным ответом я получу IP-адрес Wi-Fi fe80 :: 8dd: 7d92: 4159: 170e, который был поддельным и соединение не удалось.
Итак, я изменил код, чтобы мне понравилось,
источник
Отличное решение для быстрого в этом файле который содержит все детали.
В одном из моих приложений мне нужно получить IP-адрес Wi-Fi. Я использовал ответы выше в быстром 3, например:
В этом коде происходит сбой, потому что я должен проверять
nil
каждый оператор, который я использовал как необязательный?
. Так что мне лучше использовать данный связанный файл в моем классе. Теперь мне стало легко проверить, например:Я проанализировал строку,
"."
потому что класс интерфейса возвращает два интерфейса в моем iPhone дляen0
адреса типа «fb00 ::» и адреса типа «101.10.1.1».источник
Я создал простой файл для получения IP-адреса. Я основал это решение на ответах @ lundhjem, @ DavidH и @ Ihunath. Учитывает проводные соединения. Однако я не включил VPN в это решение.
PCNetwork.h
PCNetwork.m
источник
в iOS 13.4.1 у меня не работает. Я использую это исправление.
источник