//
// ViewController.m
// CKGet_mac_ip
//
// Created by CK on 14-11-25.
// Copyright (c) 2014年 _CK_SL. All rights reserved.
//
#import "ViewController.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 ViewController ()
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//获取当前设备的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
}
/**
* @Author, 14-11-25 10:11:35
*
* 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 , 14-11-25 10:11:11
*
* #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;
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) < 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)];
free(buf);
return [outstring uppercaseString];
}
@end