获得手机的ip
本文轉(zhuǎn)載至 http://blog.csdn.net/showhilllee/article/details/8746114? iosip手機 #define?MAXADDRS????32?? ?? extern?char?*if_names[MAXADDRS];?? extern?char?*ip_names[MAXADDRS];?? extern?char?*hw_addrs[MAXADDRS];?? extern?unsigned?long?ip_addrs[MAXADDRS];?? ?? //?Function?prototypes?? ?? void?InitAddresses();?? void?FreeAddresses();?? void?GetIPAddresses();?? void?GetHWAddresses();??
#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>??
具體實現(xiàn)的代碼#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]];?? }??
NSString*?myip?=?[self?deviceIPAdress];??
這里的myip就是我們需要的ip地址了
?
貌似ASI里獲取ip地址的鏈接不可以了。也曾試過whatismyip,在其網(wǎng)站上的截圖獲取的ip是正確的,單不知道為什么在我這里卻是錯誤的。所以,在這里分享一下獲得手機ip的方法。代碼最初源自老外,通過系統(tǒng)提供的api獲取的,這里我就直接貼代碼了:在創(chuàng)建的獲得ip類的頭文件里:
?
?
?
[java]?view plaincopyprint??
實現(xiàn)文件里:
先導入文件
?
?
[java]?view plaincopyprint?具體實現(xiàn)的代碼
?
?
?
[java]?view plaincopyprint??
然后就是調(diào)用了,首先在我們的類里面導入上面那個類,之后在實現(xiàn)文件里寫函數(shù)
?
[java]?view plaincopyprint??
然后在我們需要獲得ip的地方寫上
?
[java]?view plaincopyprint?這里的myip就是我們需要的ip地址了
?
?
手機截圖
?
程序打印截圖
總結(jié)
- 上一篇: android项目中单实例数据库类
- 下一篇: Exynos4412 裸机开发 —— I