iOS獲取當前設備的IP地址和MAC地址

wdfd 9年前發布 | 10K 次閱讀 Objective-C IOS

獲取當前設備的IP地址和MAC地址:

1.導入相關庫文件。 

2.調用方法getIPAddress 調用方法getMacAddress。

    //
// GetForIPMac.m
// Eric
//
// Created by Eric on 15-3-24.
// Copyright (c) 2015年 yons. All rights reserved.
//

#import "GetForIPMac.h"  

//Get IP 需要導入的庫文件  

#import <ifaddrs.h>  

#import <arpa/inet.h>  


//Get MAC 需要導入的庫文件  

#include <sys/socket.h> // Per msqr  

#include <sys/sysctl.h>  

#include <net/if.h>  

#include <net/if_dl.h>  


@interface GetForIPMac ()  

@end  

@implementation GetForIPMac  

- (void)viewDidLoad {  

    [super viewDidLoad];  
    // Do any additional setup after loading the view.  

    //獲取當前設備的IP和MAC地址  

    NSString *ip_str = [self getIPAddress];  

    NSLog(@" Get IP Address %@",ip_str);//192.168.191.5  

    NSString *mac_str = [self getMacAddress];  

    NSLog(@"Get MAC Address %@",mac_str); //B4:F0:AB:1C:05:93  
}  

#pragma mark IP  
/** 
 *  @Author, 15-03-24 09:07:06 
 * 
 *  Get IP Address 
 * 
 *  #import <ifaddrs.h> 
 * 
 *  #import <arpa/inet.h> 
 * 
 *  @return 
 */  

- (NSString *)getIPAddress {  

    NSString *address = @"error";  

    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;  
}  

#pragma mark MAC  

/** 

 *  @Author , 15-03-24 09:07:06 

 * 

 *   #include <sys/socket.h> // Per msqr 

 *   #include <sys/sysctl.h> 

 *   #include <net/if.h> 

 *   #include <net/if_dl.h> 

 * 

 *   Return the local MAC addy 

 *   Courtesy of FreeBSD hackers email list 

 *   Accidentally munged during previous update. Fixed thanks to mlamb. 

 * 

 *  @return 

 */  

- (NSString *) getMacAddress  
{  
    int mib[6];  

    size_t len;  

    charchar *buf;  

    unsigned charchar *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) < 0) {  

        printf("Error: sysctl, take 2");  

        return NULL;  

    }  


    ifm = (struct if_msghdr *)buf;  

    sdl = (struct sockaddr_dl *)(ifm + 1);  

    ptr = (unsigned charchar *)LLADDR(sdl);  

    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];  

}  


- (void)didReceiveMemoryWarning {  

    [super didReceiveMemoryWarning];  
    // Dispose of any resources that can be recreated.  


}  

@end  </pre> 


 本文由用戶 wdfd 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!