zoukankan      html  css  js  c++  java
  • iOS 获取ip地址

     1 #pragma mark - 获取设备当前网络IP地址
     2 + (NSString *)getIPAddress:(BOOL)preferIPv4
     3 {
     4     NSArray *searchArray = preferIPv4 ?
     5     @[ IOS_VPN @"/" IP_ADDR_IPv4, IOS_VPN @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6 ] :
     6     @[ IOS_VPN @"/" IP_ADDR_IPv6, IOS_VPN @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4 ] ;
     7     
     8     NSDictionary *addresses = [self getIPAddresses];
     9     NSLog(@"addresses: %@", addresses);
    10     
    11     __block NSString *address;
    12     [searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop)
    13      {
    14          address = addresses[key];
    15          //筛选出IP地址格式
    16          if([self isValidatIP:address]) *stop = YES;
    17      } ];
    18     return address ? address : @"0.0.0.0";
    19 }
    20 
    21 + (BOOL)isValidatIP:(NSString *)ipAddress {
    22     if (ipAddress.length == 0) {
    23         return NO;
    24     }
    25     NSString *urlRegEx = @"^([01]?\d\d?|2[0-4]\d|25[0-5])\."
    26     "([01]?\d\d?|2[0-4]\d|25[0-5])\."
    27     "([01]?\d\d?|2[0-4]\d|25[0-5])\."
    28     "([01]?\d\d?|2[0-4]\d|25[0-5])$";
    29     
    30     NSError *error;
    31     NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:urlRegEx options:0 error:&error];
    32     
    33     if (regex != nil) {
    34         NSTextCheckingResult *firstMatch=[regex firstMatchInString:ipAddress options:0 range:NSMakeRange(0, [ipAddress length])];
    35         
    36         if (firstMatch) {
    37             NSRange resultRange = [firstMatch rangeAtIndex:0];
    38             NSString *result=[ipAddress substringWithRange:resultRange];
    39             //输出结果
    40             NSLog(@"%@",result);
    41             return YES;
    42         }
    43     }
    44     return NO;
    45 }
    46 
    47 + (NSDictionary *)getIPAddresses
    48 {
    49     NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:8];
    50     
    51     // retrieve the current interfaces - returns 0 on success
    52     struct ifaddrs *interfaces;
    53     if(!getifaddrs(&interfaces)) {
    54         // Loop through linked list of interfaces
    55         struct ifaddrs *interface;
    56         for(interface=interfaces; interface; interface=interface->ifa_next) {
    57             if(!(interface->ifa_flags & IFF_UP) /* || (interface->ifa_flags & IFF_LOOPBACK) */ ) {
    58                 continue; // deeply nested code harder to read
    59             }
    60             const struct sockaddr_in *addr = (const struct sockaddr_in*)interface->ifa_addr;
    61             char addrBuf[ MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) ];
    62             if(addr && (addr->sin_family==AF_INET || addr->sin_family==AF_INET6)) {
    63                 NSString *name = [NSString stringWithUTF8String:interface->ifa_name];
    64                 NSString *type;
    65                 if(addr->sin_family == AF_INET) {
    66                     if(inet_ntop(AF_INET, &addr->sin_addr, addrBuf, INET_ADDRSTRLEN)) {
    67                         type = IP_ADDR_IPv4;
    68                     }
    69                 } else {
    70                     const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6*)interface->ifa_addr;
    71                     if(inet_ntop(AF_INET6, &addr6->sin6_addr, addrBuf, INET6_ADDRSTRLEN)) {
    72                         type = IP_ADDR_IPv6;
    73                     }
    74                 }
    75                 if(type) {
    76                     NSString *key = [NSString stringWithFormat:@"%@/%@", name, type];
    77                     addresses[key] = [NSString stringWithUTF8String:addrBuf];
    78                 }
    79             }
    80         }
    81         // Free memory
    82         freeifaddrs(interfaces);
    83     }
    84     return [addresses count] ? addresses : nil;
    85 }
  • 相关阅读:
    递推最小二乘辨识平面双机械臂Matlab代码
    Matlab Robitic Toolbox学习笔记Day2
    DSP28335与CH340使用心得
    DSP 28335 GPIO输入引脚信号跳变
    DSP 28335 RS485 SCI串口通讯 出错无法进入中断
    DSP 28335 烧写FLASH程序 可以在线仿真 无法离线运行
    CRC16-Modbus 校验 C语言
    C语言 负数转十六进制 电机转速 CANopen命令转换
    CAN转USB 调试助手使用说明
    串的模式匹配 BF算法&KMP算法
  • 原文地址:https://www.cnblogs.com/kfgcs/p/6387431.html
Copyright © 2011-2022 走看看