//// //// MyIpAddress.m //// MyLibrary //// //// Created by HDL on 2018/1/16. //// Copyright © 2018年 com.hw. All rights reserved. //// // //#import "MyIpAddress.h" //#import //#import //#import // //#define IOS_CELLULAR @"pdp_ip0" //#define IOS_WIFI @"en0" //#define IOS_VPN @"utun0" //#define IP_ADDR_IPv4 @"ipv4" //#define IP_ADDR_IPv6 @"ipv6" // //@implementation MyIpAddress // // // //#pragma mark - 获取设备当前网络IP地址 //+ (NSString *)getIPAddress:(BOOL)preferIPv4 //{ // NSArray *searchArray = preferIPv4 ? // @[ 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 ] : // @[ 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 ] ; // // NSDictionary *addresses = [self getIPAddresses]; // NSLog(@"addresses: %@", addresses); // // __block NSString *address; // [searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop) // { // address = addresses[key]; // //筛选出IP地址格式 // if([self isValidatIP:address]) *stop = YES; // } ]; // return address ? address : @"0.0.0.0"; //} // //+ (BOOL)isValidatIP:(NSString *)ipAddress { // if (ipAddress.length == 0) { // return NO; // } // NSString *urlRegEx = @"^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." // "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." // "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." // "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"; // // NSError *error; // NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:urlRegEx options:0 error:&error]; // // if (regex != nil) { // NSTextCheckingResult *firstMatch=[regex firstMatchInString:ipAddress options:0 range:NSMakeRange(0, [ipAddress length])]; // // if (firstMatch) { // NSRange resultRange = [firstMatch rangeAtIndex:0]; // NSString *result=[ipAddress substringWithRange:resultRange]; // //输出结果 // NSLog(@"%@",result); // return YES; // } // } // return NO; //} // //+ (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; //} // //@end #import #import #import #include #include #import #include #include // // MyIpAddress.m // MyLibrary // // Created by HDL on 2018/1/16. // Copyright © 2018年 com.hw. All rights reserved. // #import "MyIpAddress.h" #import #import #import #define IOS_CELLULAR @"pdp_ip0" #define IOS_WIFI @"en0" #define IOS_VPN @"utun0" #define IP_ADDR_IPv4 @"ipv4" #define IP_ADDR_IPv6 @"ipv6" @implementation MyIpAddress #pragma mark - 获取用户当前的IP地址 + ( NSString*)getCurrentLocalIP { NSString *address = @"127.0.0.1"; struct ifaddrs *interfaces = NULL; struct ifaddrs *temp_addr = NULL; int success = 0; // retrieve the current interfaces - returns 0 on success success = getifaddrs(&interfaces); if (success == 0) { // Loop through linked list of interfaces temp_addr = interfaces; while(temp_addr != NULL) { if(temp_addr->ifa_addr->sa_family == AF_INET) { // Check if interface is en0 which is the wifi connection on the iPhone if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) { // Get NSString from C String address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)]; } } temp_addr = temp_addr->ifa_next; } } // Free memory freeifaddrs(interfaces); return address; } +(NSString*)getCurrentBroadcastIP { NSString *address = @"127.0.0.1"; struct ifaddrs *interfaces = NULL; struct ifaddrs *temp_addr = NULL; int success = 0; // retrieve the current interfaces - returns 0 on success success = getifaddrs(&interfaces); if (success == 0) { // Loop through linked list of interfaces temp_addr = interfaces; while(temp_addr != NULL) { if(temp_addr->ifa_addr->sa_family == AF_INET) { // Check if interface is en0 which is the wifi connection on the iPhone if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) { // NSLog(@"子网掩码:%@",[NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_netmask)->sin_addr)]); // NSLog(@"本地IP:%@",[NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)]); address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_dstaddr)->sin_addr)]; NSLog(@"广播地址:%@",[NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_dstaddr)->sin_addr)]); } } temp_addr = temp_addr->ifa_next; } } // Free memory freeifaddrs(interfaces); return address; } #pragma mark - 域名转成IP的方法 +(NSString *)queryIpWithDomain:(NSString *)domain { struct hostent *hs; struct sockaddr_in server; if ((hs = gethostbyname([domain UTF8String])) != NULL) { server.sin_addr = *((struct in_addr*)hs->h_addr_list[0]); return [NSString stringWithUTF8String:inet_ntoa(server.sin_addr)]; } return @"1"; } @end