Questions服務器
在[iOS實現WIFI傳書]中有一個獲取IP的步驟
在此順帶總結一份關於WIFI與IP的經常使用內容網絡
Codeapp
// 獲取設備網絡Ip地址 + (NSString *)deviceNetIp { int sockfd =socket(AF_INET,SOCK_DGRAM,0); // if (sockfd < 0) return nil; NSMutableArray *ips = [NSMutableArray array]; int BUFFERSIZE = 4096; struct ifconf ifc; char buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr; struct ifreq *ifr, ifrcopy; ifc.ifc_len= BUFFERSIZE; ifc.ifc_buf= buffer; if(ioctl(sockfd, SIOCGIFCONF, &ifc) >= 0){ for(ptr = buffer; ptr < buffer + ifc.ifc_len; ){ ifr = (struct ifreq*)ptr; int len =sizeof(struct sockaddr); if(ifr->ifr_addr.sa_len > len) { len = ifr->ifr_addr.sa_len; } ptr +=sizeof(ifr->ifr_name) + len; if(ifr->ifr_addr.sa_family != AF_INET) continue; if((cptr = (char*)strchr(ifr->ifr_name,':')) != NULL) *cptr =0; if(strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == 0) continue; memcpy(lastname, ifr->ifr_name, IFNAMSIZ); ifrcopy = *ifr; ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy); if((ifrcopy.ifr_flags&IFF_UP) == 0) continue; NSString *ip = [NSString stringWithFormat:@"%s", inet_ntoa(((struct sockaddr_in*)&ifr->ifr_addr)->sin_addr)]; [ips addObject:ip]; } } close(sockfd); NSString *deviceIP = @""; for(int i = 0; i < ips.count; i++) { if(ips.count > 0) { deviceIP = [NSString stringWithFormat:@"%@", ips.lastObject]; } } return deviceIP; }
/* * 獲取wifi信息 * iOS12以上的版本獲取wifi信息,需在中設Capability置Access WIFI Infomation = ON * iOS13獲取以前需獲判斷是否贊成app適用地理位置信息 */ - (void)wifi:(void(^)(NSDictionary *sender))handler { if (@available(iOS 13.0, *)) { if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) { // 設置定位權限 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil]; } else if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) { self.manager = [[CLLocationManager alloc] init]; self.manager.delegate = self; [self.manager requestWhenInUseAuthorization]; self.wifiBlock = handler; } else { [self fetchWifi:handler]; } } else { [self fetchWifi:handler]; } } - (void)fetchWifi:(void(^)(NSDictionary *sender))handler { NSArray *interfaceNames = CFBridgingRelease(CNCopySupportedInterfaces()); NSDictionary *SSIDInfo; for (NSString *interfaceName in interfaceNames) { SSIDInfo = CFBridgingRelease(CNCopyCurrentNetworkInfo((__bridge CFStringRef)interfaceName)); BOOL isNotEmpty = (SSIDInfo.count > 0); if (isNotEmpty) { break; } } // ssid信息 即wifi名稱 NSString *ssid = [SSIDInfo objectForKey:@"SSID"]; // bssid信息 即mac地址 NSString *bssid = [SSIDInfo objectForKey:@"BSSID"]; NSLog(@"ssid = %@, mac地址 = %@", ssid, bssid); if (handler) { handler(SSIDInfo); } }
+ (NSString *)routerIp { NSString *address = @"error"; struct ifaddrs *interfaces = NULL; struct ifaddrs *temp_addr = NULL; int success = 0; success = getifaddrs(&interfaces); if (success == 0) { temp_addr = interfaces; while(temp_addr != NULL){ if(temp_addr->ifa_addr->sa_family == AF_INET) { if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) { address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)]; NSLog(@"廣播地址--%@",[NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_dstaddr)->sin_addr)]); NSLog(@"本機地址--%@",[NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)]); NSLog(@"子網掩碼地址--%@",[NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_netmask)->sin_addr)]); NSLog(@"interface--%@",[NSString stringWithUTF8String:temp_addr->ifa_name]); } } temp_addr = temp_addr->ifa_next; } } // Free memory freeifaddrs(interfaces); in_addr_t i = inet_addr([address cStringUsingEncoding:NSUTF8StringEncoding]); in_addr_t* x = &i; unsigned char *s = getdefaultgateway(x); NSString *ip=[NSString stringWithFormat:@"%d.%d.%d.%d",s[0],s[1],s[2],s[3]]; free(s); return ip; }
// 獲取本機DNS服務器 + (NSString *)dnsServers { res_state res = malloc(sizeof(struct __res_state)); int result = res_ninit(res); NSMutableArray *dnsArray = @[].mutableCopy; if ( result == 0 ) { for ( int i = 0; i < res->nscount; i++ ) { NSString *s = [NSString stringWithUTF8String : inet_ntoa(res->nsaddr_list[i].sin_addr)]; [dnsArray addObject:s]; } } else { NSLog(@"%@",@" res_init result != 0"); } res_nclose(res); return dnsArray.firstObject; }
+ (NSString *)phoneInNetIp { BOOL success; struct ifaddrs * addrs; const struct ifaddrs * cursor; success = getifaddrs(&addrs) == 0; if (success) { cursor = addrs; while (cursor != NULL) { // the second test keeps from picking up the loopback address if (cursor->ifa_addr->sa_family == AF_INET && (cursor->ifa_flags & IFF_LOOPBACK) == 0) { NSString *name = [NSString stringWithUTF8String:cursor->ifa_name]; if ([name isEqualToString:@"en0"]) // Wi-Fi adapter NSLog(@"IP:%@",[NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)cursor->ifa_addr)->sin_addr)]); return [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)cursor->ifa_addr)->sin_addr)]; } cursor = cursor->ifa_next; } freeifaddrs(addrs); } return nil; }
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; if ([[UIApplication sharedApplication] canOpenURL:url]) { [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil]; }
Oversocket
多說兩句:多數時候解決問題須要找思路,一旦肯定有解,要實現的就是Code。代碼不是最全,網絡很多人已貼出來,在此很少寫。oop