Chciałbym uzyskać programowo adres IP mojego iPada. Jak mogę wysłać zapytanie do podsystemu sieciowego, aby dowiedzieć się, jakie są moje adresy IPv4 (i IPv6)?
PS: Czy mogę jakoś wyłączyć IPv6?
ios
macos
ip-address
ipv6
Wilbur
źródło
źródło
Odpowiedzi:
Poniższy kod znajduje wszystkie adresy IPv4 i IPv6 na urządzeniu z systemem iOS lub OSX. Pierwsza
getIPAddress
metoda działa mniej więcej tak, jak starszy kod w tej odpowiedzi: możesz preferować jeden lub drugi typ adresu i zawsze preferuje WIFI niż komórkową (oczywiście możesz to zmienić).Co ciekawsze, może zwrócić słownik wszystkich znalezionych adresów, pomijając adresy
not up
interfejsów lub adresy powiązane zloopback
. Poprzedni kod oraz inne rozwiązania na ten temat nie będą poprawnie dekodować IPv6 (inet_ntoa nie radzi sobie z nimi). Zwrócił na to uwagę Jens Alfke na forum Apple - właściwą funkcją do użycia jest inet_ntop (spójrz na stronę podręcznika systemowego lub zapoznaj się z tym artykułem na temat inet_ntop również dostarczonym przez Jensa.Klucze słownika mają postać „interfejs” „/” „ipv4 lub ipv6”.
EDIT1: Kod zaktualizowany 16 maja 2014 r. (Błąd wskazany przez lhunatha, patrz komentarze). Adresy zwrotne są teraz zwracane, ale możesz łatwo odkomentować test, aby je wykluczyć.
EDIT2: (przez nieznaną osobę): Dalsze ulepszenia 13 marca 2015: W przypadku, gdy użytkownik korzysta z VPN (niezależnie od sieci Wi-Fi lub komórkowej), poprzedni kod nie powiódłby się. Teraz działa nawet z połączeniami VPN. Połączenia VPN mają pierwszeństwo przed Wi-Fi i komórką, ponieważ w ten sposób urządzenie je obsługuje. Powinno to działać nawet na komputerach Mac, ponieważ połączenie VPN na komputerze Mac również używa IF utun0, ale nie zostało przetestowane.
EDIT3: (08.09.2016) Biorąc pod uwagę problemy, których doświadczył @Qiulang (patrz komentarze) z kodem VPN (który dodał ktoś inny), skomentowałem to. Jeśli ktoś definitywnie wie, jak określić VPN użytkownika, prosimy o dołączenie komentarza.
źródło
addr
dostaje NULL? moi użytkownicy czasami otrzymują wartość NULL. czy wiesz, jakie są możliwe powody?AF_INET
do sprawdzenia. może to być?W pliku implementacji .m,
źródło
Wiele istniejących rozwiązań uwzględnia tylko interfejsy bezprzewodowe, które nie będą działać w przypadku połączeń przewodowych za pośrednictwem adaptera Ethernet (tj. Bez Wi-Fi lub 3G); zobacz to nowsze rozwiązanie, które uwzględnia również adresy IP uzyskiwane za pośrednictwem interfejsów przewodowych.
iPad: Jak uzyskać adres IP programowo WIRED (nie przez sieć bezprzewodową)
źródło
Uzyskaj adres IP za pomocą Swift 3:
źródło
Bieżące rozwiązanie nie zwraca urządzenia en0 w systemie OS X, poniższy kod używa struktury konfiguracji systemu do pobrania interfejsów, a następnie używa standardowych funkcji języka C w celu uzyskania adresu IP.
źródło
Ta odpowiedź została zainspirowana odpowiedzią @ DavidH. Poprawiłem kilka kwestii, otrzymuje
inet_ntop
zgetnameinfo
co umożliwia podejście czystsze. Zauważ, że daje to słownik, który mapuje nazwę interfejsu na tablicę adresów IP (interfejs może mieć wiele powiązanych z nim adresów IPv4 i IPv6). Nie rozróżnia IPv4 i IPv6:źródło
strf
- czy jest to funkcja pomocnicza, którą masz w swoim kodzie?err
istrf
. Można po prostu zastąpićstrf
z-stringWithCString:encoding:
.err
jestNSLog
opakowaniem, które wypisuje również plik i wiersz. github.com/Lyndir/Pearl/blob/master/Pearl/…@ DavidH Odpowiedź działa dobrze, dopóki nie otrzymałem tego wyniku z jakiejś sieci komórkowej 4G:
Nie używam VPN, więc nie mam pojęcia, dlaczego mam utun0 / ipv6.
--- Zaktualizowano ---
Dalej debugowałem ten problem i stwierdziłem, że mogę uzyskać fałszywy adres VPN nawet w innych sieciach 4G (czy to błąd iOS?),
Gdybym użył VPN, otrzymam to:
Więc to jest utun1 NIE utun0
Bez zastanawiania się, dlaczego będę musiał po prostu zrezygnować z czeku VPN :(
---- aktualizacja ----
Zgłosiłem błąd (28131847) do Apple i odpowiedziałem: „Nie wszystkie interfejsy utun są przeznaczone dla sieci VPN. Istnieją inne funkcje systemu operacyjnego, które używają interfejsów utun”.
Ale kiedy zapytałem, jak uzyskać prawidłowy adres IP VPN, ich odpowiedź była raczej rozczarowana: „Możesz przejść do Ustawienia -> VPN i spojrzeć na konfigurację VPN, aby sprawdzić, czy VPN jest aktywny. W niektórych przypadkach możesz zobaczyć przypisany adres IP również tam. Zamykamy ten raport o błędzie. " :(
---- aktualizacja 2016/11/04 ----
Znów napotykam problem i muszę dalej zmodyfikować odpowiedź @ DavidH, aby to naprawić:
Byłem w sieci 4G i dostałem ten adres:
Z jego oryginalną odpowiedzią otrzymam wifi IP fe80 :: 8dd: 7d92: 4159: 170e, które było fałszywe i połączenie nie powiodło się.
Więc zmodyfikowałem kod, by polubić,
źródło
Świetne rozwiązanie dla szybkiego w tym pliku, który zawiera wszystkie szczegóły.
W jednej z moich aplikacji muszę pobrać adres IP Wi-Fi. Użyłem odpowiedzi powyżej, w swift 3 w ten sposób:
W tym kodzie ulega awarii, ponieważ muszę sprawdzić
nil
w każdej instrukcji, której użyłem jako opcjonalne?
. Więc lepiej jest dla mnie użyć podanego połączonego pliku w mojej klasie. Łatwo mi teraz sprawdzić:Przeanalizowałem ciąg znaków,
"."
ponieważ klasa interfejsu zwraca dwa interfejsy w moim iPhonie dlaen0
adresu takiego jak „fb00 ::” i adresu takiego jak „101.10.1.1”źródło
Stworzyłem prosty plik do uzyskania adresu IP. Oparłem to rozwiązanie na odpowiedziach @ lundhjem, @ DavidH i @ Ihunath. Uwzględnia połączenia przewodowe. Jednak nie uwzględniłem VPN w tym rozwiązaniu.
PCNetwork.h
PCNetwork. M
źródło
w iOS 13.4.1 nie działa dla mnie. używam tego naprawić to.
źródło