Created
October 19, 2012 02:04
-
-
Save piaoapiao/3915864 to your computer and use it in GitHub Desktop.
ip get
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
http://www.cocoachina.com/newbie/tutorial/2011/1025/3420.html | |
http://blog.csdn.net/favormm/article/details/6858330 | |
第一种方法是用系统api的方式获取,如下 | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <unistd.h> | |
#include <sys/ioctl.h> | |
#include <sys/types.h> | |
#include <sys/socket.h> | |
#include <netinet/in.h> | |
#include <netdb.h> | |
#include <arpa/inet.h> | |
#include <sys/sockio.h> | |
#include <net/if.h> | |
#include <errno.h> | |
#include <net/if_dl.h> | |
//#include "GetAddresses.h" | |
#define min(a,b) ((a) < (b) ? (a) : (b)) | |
#define max(a,b) ((a) > (b) ? (a) : (b)) | |
#define BUFFERSIZE 4000 | |
char *if_names[MAXADDRS]; | |
char *ip_names[MAXADDRS]; | |
char *hw_addrs[MAXADDRS]; | |
unsigned long ip_addrs[MAXADDRS]; | |
static int nextAddr = 0; | |
void InitAddresses() | |
{ | |
int i; | |
for (i=0; i<MAXADDRS; ++i) | |
{ | |
if_names[i] = ip_names[i] = hw_addrs[i] = NULL; | |
ip_addrs[i] = 0; | |
} | |
} | |
void FreeAddresses() | |
{ | |
int i; | |
for (i=0; i<MAXADDRS; ++i) | |
{ | |
if (if_names[i] != 0) free(if_names[i]); | |
if (ip_names[i] != 0) free(ip_names[i]); | |
if (hw_addrs[i] != 0) free(hw_addrs[i]); | |
ip_addrs[i] = 0; | |
} | |
InitAddresses(); | |
} | |
void GetIPAddresses() | |
{ | |
int i, len, flags; | |
char buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr; | |
struct ifconf ifc; | |
struct ifreq *ifr, ifrcopy; | |
struct sockaddr_in *sin; | |
char temp[80]; | |
int sockfd; | |
for (i=0; i<MAXADDRS; ++i) | |
{ | |
if_names[i] = ip_names[i] = NULL; | |
ip_addrs[i] = 0; | |
} | |
sockfd = socket(AF_INET, SOCK_DGRAM, 0); | |
if (sockfd < 0) | |
{ | |
perror("socket failed"); | |
return; | |
} | |
ifc.ifc_len = BUFFERSIZE; | |
ifc.ifc_buf = buffer; | |
if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) | |
{ | |
perror("ioctl error"); | |
return; | |
} | |
lastname[0] = 0; | |
for (ptr = buffer; ptr < buffer + ifc.ifc_len; ) | |
{ | |
ifr = (struct ifreq *)ptr; | |
len = max(sizeof(struct sockaddr), ifr->ifr_addr.sa_len); | |
ptr += sizeof(ifr->ifr_name) + len; // for next one in buffer | |
if (ifr->ifr_addr.sa_family != AF_INET) | |
{ | |
continue; // ignore if not desired address family | |
} | |
if ((cptr = (char *)strchr(ifr->ifr_name, ':')) != NULL) | |
{ | |
*cptr = 0; // replace colon will null | |
} | |
if (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == 0) | |
{ | |
continue; /* already processed this interface */ | |
} | |
memcpy(lastname, ifr->ifr_name, IFNAMSIZ); | |
ifrcopy = *ifr; | |
ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy); | |
flags = ifrcopy.ifr_flags; | |
if ((flags & IFF_UP) == 0) | |
{ | |
continue; // ignore if interface not up | |
} | |
if_names[nextAddr] = (char *)malloc(strlen(ifr->ifr_name)+1); | |
if (if_names[nextAddr] == NULL) | |
{ | |
return; | |
} | |
strcpy(if_names[nextAddr], ifr->ifr_name); | |
sin = (struct sockaddr_in *)&ifr->ifr_addr; | |
strcpy(temp, inet_ntoa(sin->sin_addr)); | |
ip_names[nextAddr] = (char *)malloc(strlen(temp)+1); | |
if (ip_names[nextAddr] == NULL) | |
{ | |
return; | |
} | |
strcpy(ip_names[nextAddr], temp); | |
ip_addrs[nextAddr] = sin->sin_addr.s_addr; | |
++nextAddr; | |
} | |
close(sockfd); | |
} | |
void GetHWAddresses() | |
{ | |
struct ifconf ifc; | |
struct ifreq *ifr; | |
int i, sockfd; | |
char buffer[BUFFERSIZE], *cp, *cplim; | |
char temp[80]; | |
for (i=0; i<MAXADDRS; ++i) | |
{ | |
hw_addrs[i] = NULL; | |
} | |
sockfd = socket(AF_INET, SOCK_DGRAM, 0); | |
if (sockfd < 0) | |
{ | |
perror("socket failed"); | |
return; | |
} | |
ifc.ifc_len = BUFFERSIZE; | |
ifc.ifc_buf = buffer; | |
if (ioctl(sockfd, SIOCGIFCONF, (char *)&ifc) < 0) | |
{ | |
perror("ioctl error"); | |
close(sockfd); | |
return; | |
} | |
ifr = ifc.ifc_req; | |
cplim = buffer + ifc.ifc_len; | |
for (cp=buffer; cp < cplim; ) | |
{ | |
ifr = (struct ifreq *)cp; | |
if (ifr->ifr_addr.sa_family == AF_LINK) | |
{ | |
struct sockaddr_dl *sdl = (struct sockaddr_dl *)&ifr->ifr_addr; | |
int a,b,c,d,e,f; | |
int i; | |
strcpy(temp, (char *)ether_ntoa(LLADDR(sdl))); | |
sscanf(temp, "%x:%x:%x:%x:%x:%x", &a, &b, &c, &d, &e, &f); | |
sprintf(temp, "%02X:%02X:%02X:%02X:%02X:%02X",a,b,c,d,e,f); | |
for (i=0; i<MAXADDRS; ++i) | |
{ | |
if ((if_names[i] != NULL) && (strcmp(ifr->ifr_name, if_names[i]) == 0)) | |
{ | |
if (hw_addrs[i] == NULL) | |
{ | |
hw_addrs[i] = (char *)malloc(strlen(temp)+1); | |
strcpy(hw_addrs[i], temp); | |
break; | |
} | |
} | |
} | |
} | |
cp += sizeof(ifr->ifr_name) + max(sizeof(ifr->ifr_addr), ifr->ifr_addr.sa_len); | |
} | |
close(sockfd); | |
} | |
- (NSString *)deviceIPAdress { | |
InitAddresses(); | |
GetIPAddresses(); | |
GetHWAddresses(); | |
return [NSString stringWithFormat:@"%s", ip_names[1]]; | |
} | |
这样得到的ip,如果在内网中,那么就是内网的ip. | |
第二种方法是可以获取公网ip | |
- (void)getCurrentIP | |
{ | |
NSURL *url = [NSURL URLWithString:@"http://automation.whatismyip.com/n09230945.asp"]; | |
__block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; | |
[request setCompletionBlock:^{ | |
NSString *responseString = [request responseString]; | |
if (responseString) { | |
NSString *ip = [NSString stringWithFormat:@"%@", responseString]; | |
NSLog(@"responseString = %@", ip); | |
}; | |
}]; | |
[request setFailedBlock:^{ | |
}]; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment