Gostaria de obter o endereço IP do meu iPad programaticamente. Como posso consultar o subsistema de rede para descobrir quais são meus endereços IPv4 (e IPv6)?
PS: Posso desativar o IPv6 de alguma forma?
ios
macos
ip-address
ipv6
Wilbur
fonte
fonte
Respostas:
O código a seguir localiza todos os endereços IPv4 e IPv6 em um dispositivo iOS ou OSX. O primeiro
getIPAddress
método atua mais ou menos como o código mais antigo nesta resposta: você pode preferir um ou outro endereço de tipo e sempre prefere WIFI do que celular (obviamente, você pode alterar isso).O mais interessante é que ele pode retornar um dicionário de todos os endereços encontrados, ignorando endereços de
not up
interfaces ou endereços associadosloopback
. O código anterior e outras soluções neste tópico não decodificarão adequadamente o IPv6 (inet_ntoa não pode lidar com eles). Isso foi apontado por Jens Alfke em um fórum da Apple - a função apropriada a ser usada é inet_ntop (consulte a página do manual e ou consulte este artigo do inet_ntop também fornecido por Jens.As chaves do dicionário têm o formato "interface" "/" "ipv4 ou ipv6".
EDIT1: Código atualizado em 16 de maio de 2014 (bug apontado por lhunath, ver comentários). Os endereços de loopback agora retornaram, mas é fácil descomentar o teste para excluí-los você mesmo.
EDIT2: (por uma pessoa desconhecida): Aprimorado em 13 de março de 2015: caso o usuário use uma VPN (independentemente de WiFi ou celular), o código anterior falharia. Agora, ele funciona mesmo com conexões VPN. As conexões VPN têm precedência sobre o Wi-Fi e o Cell, porque é assim que o dispositivo lida com isso. Isso deve funcionar para Macs, já que a conexão VPN em um Mac também usa IF utun0, mas não foi testada.
EDIT3: (8/9/2016) Dados os problemas enfrentados pelo @Qiulang (ver comentários) com o código da VPN (que outra pessoa adicionou), eu comentei. Se alguém souber definitivamente como especificar uma VPN de usuário, entre em contato com um comentário.
fonte
addr
fica NULL? meus usuários ocasionalmente recebem NULL. você sabe o que é possível?AF_INET
para verificar. poderia ser isso?No seu arquivo de implementação .m,
fonte
Muitas soluções existentes consideram apenas interfaces sem fio, que não funcionam para conexões com fio via adaptador Ethernet (ou seja, sem Wifi ou 3G); veja esta solução mais recente, que também considera endereços IP obtidos por meio de interfaces com fio.
iPad: Como obter o endereço IP programaticamente com FIO (não via conexão sem fio)
fonte
Obtenha o endereço IP usando o Swift 3:
fonte
A solução atual não retorna o dispositivo en0 no OS X, o código a seguir usa o System Configuration Framework para obter as interfaces e depois as funções C padrão para obter o endereço IP.
fonte
Esta resposta foi inspirada na resposta de @ DavidH. Corrigi alguns problemas, substituídos
inet_ntop
pelosgetnameinfo
que permitem uma abordagem mais limpa. Observe que isso gera um dicionário que mapeia um nome de interface para uma matriz de endereços IP (uma interface pode ter vários IPv4 e IPv6 associados a ela, tecnicamente). Não faz distinção entre IPv4 e IPv6:fonte
strf
- essa é uma função auxiliar que você tem no seu código?err
estrf
. Você pode simplesmente substituirstrf
por-stringWithCString:encoding:
.err
é umNSLog
wrapper que gera o arquivo e a linha também. github.com/Lyndir/Pearl/blob/master/Pearl/…A resposta de @ DavidH funciona bem até eu obter esse resultado em alguma rede celular 4G:
Como não estou usando o vpn, não tenho idéia do porquê de usar um utun0 / ipv6.
--- Atualizada ---
Eu depurei ainda mais esse problema e descobri que posso obter um endereço vpn falso mesmo em outras redes 4G (esse bug do iOS é ??),
Se eu usei vpn, receberei o seguinte:
Portanto, é utun1 NÃO utun0
Sem descobrir por que eu só vou ter que largar vpn check :(
---- atualização ----
Eu levantei um bug (28131847) para a apple e respondi com "Nem todas as interfaces utun são para VPN. Existem outros recursos do sistema operacional que usam interfaces utun".
Mas quando perguntei como obter um endereço IP vpn válido, a resposta deles foi bastante decepcionante: "Você pode acessar Configurações -> VPN e verificar sua configuração de VPN para ver se a VPN está ativa. Em alguns casos, você pode ver o endereço IP atribuído também. Estamos encerrando este relatório de erro. " :(
---- atualização 2016/11/04 ----
Eu bato no problema novamente e preciso modificar ainda mais a resposta de @ DavidH para corrigi-lo:
Eu estava na rede 4G e consegui este endereço:
Com a resposta original, receberei o IP wifi fe80 :: 8dd: 7d92: 4159: 170e, que era falso e a conexão falhou.
Então eu modifiquei o código para gostar,
fonte
Ótima solução para agilizar neste arquivo que serve todos os detalhes.
Em um dos meus aplicativos, preciso buscar o endereço IP wifi. Eu usei as respostas acima, no Swift 3 como este:
Nesse código, ele trava porque tenho que procurar
nil
em cada instrução que usei como opcional?
. Portanto, é melhor para mim usar o arquivo vinculado fornecido na minha classe. Torna-se fácil para mim verificar agora como:Analisei a string
"."
porque a Interface Class retorna duas interfaces no meu iPhone paraen0
endereços como "fb00 ::" e endereços como "101.10.1.1"fonte
Eu criei um arquivo simples para obter o endereço IP. Baseei esta solução nas respostas de @ lundhjem, @ de DavidH e @ de Ihunath. Considera conexões com fio. Eu não incluí VPN nesta solução, no entanto.
PCNetwork.h
PCNetwork.m
fonte
no iOS 13.4.1 não funciona para mim. Eu uso isso corrigi-lo.
fonte