Je voudrais obtenir l’adresse IP de mon iPad par programme. Comment est-ce que je peux interroger le sous-système réseau pour savoir quels sont mes adresses IPv4 (et IPv6) ?
Merci. PS : Puis-je désactiver IPv6 en quelque sorte ?
Je voudrais obtenir l’adresse IP de mon iPad par programme. Comment est-ce que je peux interroger le sous-système réseau pour savoir quels sont mes adresses IPv4 (et IPv6) ?
Merci. PS : Puis-je désactiver IPv6 en quelque sorte ?
Le code suivant trouve toutes les adresses IPv4 et IPv6 sur un iOS ou OSX appareil. La première getIPAddress
méthode d'actes plus ou moins comme le plus ancien code dans cette réponse: vous pouvez préférer l'un ou l'autre type d'adresse, et il préfère toujours les WIFI cellulaires (évidemment, vous avez la possibilité de changer cela).
Plus intéressant, il peut retourner un dictionnaire de toutes les adresses trouvées, en ignorant les adresses pour not up
interfaces, ou des adresses associées à loopback
. Le code précédent ainsi que d'autres solutions sur ce sujet ne sera pas décoder correctement le protocole IPv6 (inet_ntoa ne peut pas traiter avec eux). Cela m'a été signalé par Jens Alfke sur un Apple - forum de la bonne fonction à utiliser est inet_ntop (regardez la page de man, et ou se référer à ce inet_ntop l'article a également fourni par Jens.
Le dictionnaire touches sont de la forme "interface" "/" "ipv4 ou ipv6".
#include <ifaddrs.h>
#include <arpa/inet.h>
#include <net/if.h>
#define IOS_CELLULAR @"pdp_ip0"
#define IOS_WIFI @"en0"
#define IP_ADDR_IPv4 @"ipv4"
#define IP_ADDR_IPv6 @"ipv6"
- (NSString *)getIPAddress:(BOOL)preferIPv4
{
NSArray *searchArray = preferIPv4 ?
@[ IOS_WIFI @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6 ] :
@[ IOS_WIFI @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4 ] ;
NSDictionary *addresses = [self getIPAddresses];
NSLog(@"addresses: %@", addresses);
__block NSString *address;
[searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop)
{
address = addresses[key];
if(address) *stop = YES;
} ];
return address ? address : @"0.0.0.0";
}
- (NSDictionary *)getIPAddresses
{
NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:8];
// retrieve the current interfaces - returns 0 on success
struct ifaddrs *interfaces;
if(!getifaddrs(&interfaces)) {
// Loop through linked list of interfaces
struct ifaddrs *interface;
for(interface=interfaces; interface; interface=interface->ifa_next) {
if(!(interface->ifa_flags & IFF_UP) /* || (interface->ifa_flags & IFF_LOOPBACK) */ ) {
continue; // deeply nested code harder to read
}
const struct sockaddr_in *addr = (const struct sockaddr_in*)interface->ifa_addr;
char addrBuf[ MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) ];
if(addr && (addr->sin_family==AF_INET || addr->sin_family==AF_INET6)) {
NSString *name = [NSString stringWithUTF8String:interface->ifa_name];
NSString *type;
if(addr->sin_family == AF_INET) {
if(inet_ntop(AF_INET, &addr->sin_addr, addrBuf, INET_ADDRSTRLEN)) {
type = IP_ADDR_IPv4;
}
} else {
const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6*)interface->ifa_addr;
if(inet_ntop(AF_INET6, &addr6->sin6_addr, addrBuf, INET6_ADDRSTRLEN)) {
type = IP_ADDR_IPv6;
}
}
if(type) {
NSString *key = [NSString stringWithFormat:@"%@/%@", name, type];
addresses[key] = [NSString stringWithUTF8String:addrBuf];
}
}
}
// Free memory
freeifaddrs(interfaces);
}
return [addresses count] ? addresses : nil;
}
Code de la dernière mise à jour le 16 Mai 2014 (bug signalé par lhunath, voir les commentaires). Les adresses de Loopback maintenant de retour, mais sa facile pour vous commenter le test d'exclure vous-même.
Cette réponse a été inspirée par la réponse de @DavidH. J’ai corrigé quelques problèmes, remplacés avec
qui permet une approche plus propre. Notez que cela donne un dictionnaire qui mappe un nom d’interface à un tableau d’adresses IP (une interface peut avoir plusieurs IPv4 et de IPv6 lui est associé, sur le plan technique). Il ne distingue pas entre IPv4 et IPv6 :
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.