iphone开发之获取网卡的MAC地址和IP地址

简介:

这是获取网卡的硬件地址的代码,如果无法编译通过,记得把下面的这几个头文件加上把。

 

#include <sys/socket.h> // Per msqr 
#include <sys/sysctl.h> 
#include <net/if.h> 
#include <net/if_dl.h>

 

#pragma mark MAC addy 
// Return the local MAC addy 
// Courtesy of FreeBSD hackers email list 
// Accidentally munged during previous update. Fixed thanks to mlamb. 
- (NSString *) macaddress 

    int                    mib[6]; 
    size_t                len; 
    char                *buf; 
    unsigned char        *ptr; 
    struct if_msghdr    *ifm; 
    struct sockaddr_dl    *sdl; 
    
    mib[0] = CTL_NET; 
    mib[1] = AF_ROUTE; 
    mib[2] = 0; 
    mib[3] = AF_LINK; 
    mib[4] = NET_RT_IFLIST; 
    
    if ((mib[5] = if_nametoindex("en0")) == 0) { 
        printf("Error: if_nametoindex error\n"); 
        return NULL; 
    } 
    
    if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) { 
        printf("Error: sysctl, take 1\n"); 
        return NULL; 
    } 
    
    if ((buf = malloc(len)) == NULL) { 
        printf("Could not allocate memory. error!\n"); 
        return NULL; 
    } 
    
    if (sysctl(mib, 6, buf, &len, NULL, 0) &lt; 0) { 
        printf("Error: sysctl, take 2"); 
        return NULL; 
    } 
    
    ifm = (struct if_msghdr *)buf; 
    sdl = (struct sockaddr_dl *)(ifm + 1); 
    ptr = (unsigned char *)LLADDR(sdl); 
    // NSString *outstring = [NSString stringWithFormat:@"%02x:%02x:%02x:%02x:%02x:%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)]; 
    NSString *outstring = [NSString stringWithFormat:@"%02x%02x%02x%02x%02x%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)]; 
    free(buf); 
    return [outstring uppercaseString]; 
}

 

 

 

这写头文件是用于获取ip等系列功能的 
#include &lt;arpa/inet.h> 
#include <netdb.h>

#include <net/if.h>

#include <ifaddrs.h> 
#import <dlfcn.h> 
#import "wwanconnect.h//frome apple 你可能没有哦

#import <SystemConfiguration/SystemConfiguration.h>

 

 

获取ip地址的代码有很多

 

这是外网可见的ip地址,如果你在小区的局域网中,那就是小区的,不是局域网的内网地址。

- (NSString *) whatismyipdotcom 

    NSError *error; 
    NSURL *ipURL = [NSURL URLWithString:@"http://www.whatismyip.com/automation/n09230945.asp"]; 
    NSString *ip = [NSString stringWithContentsOfURL:ipURL encoding:1 error:&error]; 
    return ip ? ip : [error localizedDescription]; 
}

 

这是获取本地wifi的ip地址

 

// Matt Brown's get WiFi IP addy solution 
// Author gave permission to use in Cookbook under cookbook license 
// http://mattbsoftware.blogspot.com/2009/04/how-to-get-ip-address-of-iphone-os-v221.html 
- (NSString *) localWiFiIPAddress 

    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-&gt;ifa_addr-&gt;sa_family == AF_INET && (cursor-&gt;ifa_flags & IFF_LOOPBACK) == 0) 
            { 
                NSString *name = [NSString stringWithUTF8String:cursor-&gt;ifa_name]; 
                if ([name isEqualToString:@"en0"])  // Wi-Fi adapter 
                    return [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)cursor-&gt;ifa_addr)-&gt;sin_addr)]; 
            } 
            cursor = cursor-&gt;ifa_next; 
        } 
        freeifaddrs(addrs); 
    } 
    return nil; 
}

 

NSString和Address的转换

+ (NSString *) stringFromAddress: (const struct sockaddr *) address 

    if(address && address-&gt;sa_family == AF_INET) { 
        const struct sockaddr_in* sin = (struct sockaddr_in*) address; 
        return [NSString stringWithFormat:@"%@:%d", [NSString stringWithUTF8String:inet_ntoa(sin-&gt;sin_addr)], ntohs(sin-&gt;sin_port)]; 
    } 
    
    return nil; 


+ (BOOL)addressFromString:(NSString *)IPAddress address:(struct sockaddr_in *)address 

    if (!IPAddress || ![IPAddress length]) { 
        return NO; 
    } 
    
    memset((char *) address, sizeof(struct sockaddr_in), 0); 
    address-&gt;sin_family = AF_INET; 
    address-&gt;sin_len = sizeof(struct sockaddr_in); 
    
    int conversionResult = inet_aton([IPAddress UTF8String], &address-&gt;sin_addr); 
    if (conversionResult == 0) { 
        NSAssert1(conversionResult != 1, @"Failed to convert the IP address string into a sockaddr_in: %@", IPAddress); 
        return NO; 
    } 
    
    return YES; 

获取host的名称 
- (NSString *) hostname 

    char baseHostName[256]; // Thanks, Gunnar Larisch 
    int success = gethostname(baseHostName, 255); 
    if (success != 0) return nil; 
    baseHostName[255] = '\0'; 
    
#if TARGET_IPHONE_SIMULATOR 
     return [NSString stringWithFormat:@"%s", baseHostName]; 
#else 
    return [NSString stringWithFormat:@"%s.local", baseHostName]; 
#endif 

从host获取地址 
- (NSString *) getIPAddressForHost: (NSString *) theHost 

    struct hostent *host = gethostbyname([theHost UTF8String]); 
    if (!host) {herror("resolv"); return NULL; } 
    struct in_addr **list = (struct in_addr **)host-&gt;h_addr_list; 
    NSString *addressString = [NSString stringWithCString:inet_ntoa(*list[0]) encoding:NSUTF8StringEncoding]; 
    return addressString; 
}

这是本地host的IP地址 
- (NSString *) localIPAddress 

    struct hostent *host = gethostbyname([[self hostname] UTF8String]); 
    if (!host) {herror("resolv"); return nil;} 
    struct in_addr **list = (struct in_addr **)host-&gt;h_addr_list; 
    return [NSString stringWithCString:inet_ntoa(*list[0]) encoding:NSUTF8StringEncoding]; 
}










本文转自 arthurchen 51CTO博客,原文链接:http://blog.51cto.com/arthurchen/575106,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
编解码 Android开发
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)1
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)
327 1
|
6月前
|
Android开发 iOS开发 开发者
轻松实现 UniApp Xcode 上传 IPA 无需 Mac,appuploder 一键上传助你高效开发!
轻松实现 UniApp Xcode 上传 IPA 无需 Mac,appuploder 一键上传助你高效开发!
|
6月前
|
调度 iOS开发 MacOS
【MacOS 系列】mac常用快捷键收集,包含提高开发效率、精选快捷键、内置截图快捷键
【MacOS 系列】mac常用快捷键收集,包含提高开发效率、精选快捷键、内置截图快捷键
131 0
|
6月前
|
缓存 网络协议 网络架构
【计算机网络】第三章 数据链路层(MAC地址 IP地址 ARP协议)
【计算机网络】第三章 数据链路层(MAC地址 IP地址 ARP协议)
118 1
|
10天前
|
编解码 测试技术 iOS开发
iPhone 屏幕尺寸和开发适配
【10月更文挑战第23天】iPhone 的屏幕尺寸变化给开发者带来了一定的挑战,但也为创新提供了机遇。通过深入了解不同屏幕尺寸的特点,遵循适配原则和策略,运用合适的技巧和方法,我们能够为用户提供在不同 iPhone 机型上都具有良好体验的应用。在未来,随着技术的不断进步,我们还需要持续学习和适应,以满足用户对优质应用体验的不断追求。
|
3月前
|
域名解析 网络协议 虚拟化
|
10天前
|
编解码 iOS开发 UED
响应式设计在 iPhone 开发适配中的具体应用
【10月更文挑战第23天】响应式设计在 iPhone 开发适配中扮演着至关重要的角色,它能够帮助我们打造出适应不同屏幕尺寸和用户需求的高质量应用。通过合理运用响应式设计的原则和方法,我们可以在提供良好用户体验的同时,提高开发效率和应用的可维护性。
|
2月前
|
缓存 网络协议 网络架构
网络抓包分析【IP,ICMP,ARP】以及 IP数据报,MAC帧,ICMP报和ARP报的数据报格式
本文详细介绍了如何使用网络抓包工具Wireshark进行网络抓包分析,包括以太网v2 MAC帧、IP数据报、ICMP报文和ARP报文的格式,以及不同网络通信的过程。文章通过抓包分析展示了IP数据报、ICMP数据报和ARP数据报的具体信息,包括MAC地址、IP地址、ICMP类型和代码、以及ARP的硬件类型、协议类型、操作类型等。通过这些分析,可以更好地理解网络协议的工作机制和数据传输过程。
网络抓包分析【IP,ICMP,ARP】以及 IP数据报,MAC帧,ICMP报和ARP报的数据报格式
|
6月前
|
编解码 开发工具 Android开发
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)2
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)2
361 2
IP和MAC的作用区别
【9月更文挑战第3天】IP 是地址,有定位功能;MAC 是身份证,无定位功能