zoukankan      html  css  js  c++  java
  • 获得手机的ip

    本文转载至 http://blog.csdn.net/showhilllee/article/details/8746114 
     
     
    貌似ASI里获取ip地址的链接不可以了。也曾试过whatismyip,在其网站上的截图获取的ip是正确的,单不知道为什么在我这里却是错误的。所以,在这里分享一下获得手机ip的方法。代码最初源自老外,通过系统提供的api获取的,这里我就直接贴代码了:

    在创建的获得ip类的头文件里:

     

    1. #define MAXADDRS    32  
    2.   
    3. extern char *if_names[MAXADDRS];  
    4. extern char *ip_names[MAXADDRS];  
    5. extern char *hw_addrs[MAXADDRS];  
    6. extern unsigned long ip_addrs[MAXADDRS];  
    7.   
    8. // Function prototypes  
    9.   
    10. void InitAddresses();  
    11. void FreeAddresses();  
    12. void GetIPAddresses();  
    13. void GetHWAddresses();  


    实现文件里:

    先导入文件

     

    1. #include <stdio.h>  
    2. #include <stdlib.h>  
    3. #include <string.h>  
    4. #include <unistd.h>  
    5. #include <sys/ioctl.h>  
    6. #include <sys/types.h>  
    7. #include <sys/socket.h>  
    8. #include <netinet/in.h>  
    9. #include <netdb.h>  
    10. #include <arpa/inet.h>  
    11. #include <sys/sockio.h>  
    12. #include <net/if.h>  
    13. #include <errno.h>  
    14. #include <net/if_dl.h>  

    具体实现的代码

     

     

    1. #define    min(a,b)    ((a) < (b) ? (a) : (b))  
    2. #define    max(a,b)    ((a) > (b) ? (a) : (b))  
    3.   
    4. #define BUFFERSIZE    4000  
    5.   
    6. char *if_names[MAXADDRS];  
    7. char *ip_names[MAXADDRS];  
    8. char *hw_addrs[MAXADDRS];  
    9. unsigned long ip_addrs[MAXADDRS];  
    10.   
    11. static int   nextAddr = 0;  
    12.   
    13. void InitAddresses()  
    14. {  
    15.     int i;  
    16.     for (i=0; i<MAXADDRS; ++i)  
    17.     {  
    18.         if_names[i] = ip_names[i] = hw_addrs[i] = NULL;  
    19.         ip_addrs[i] = 0;  
    20.     }  
    21. }  
    22.   
    23. void FreeAddresses()  
    24. {  
    25.     int i;  
    26.     for (i=0; i<MAXADDRS; ++i)  
    27.     {  
    28.         if (if_names[i] != 0) free(if_names[i]);  
    29.         if (ip_names[i] != 0) free(ip_names[i]);  
    30.         if (hw_addrs[i] != 0) free(hw_addrs[i]);  
    31.         ip_addrs[i] = 0;  
    32.     }  
    33.     InitAddresses();  
    34. }  
    35.   
    36. void GetIPAddresses()  
    37. {  
    38.     int                 i, len, flags;  
    39.     char                buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr;  
    40.     struct ifconf       ifc;  
    41.     struct ifreq        *ifr, ifrcopy;  
    42.     struct sockaddr_in    *sin;  
    43.       
    44.     char temp[80];  
    45.       
    46.     int sockfd;  
    47.       
    48.     for (i=0; i<MAXADDRS; ++i)  
    49.     {  
    50.         if_names[i] = ip_names[i] = NULL;  
    51.         ip_addrs[i] = 0;  
    52.     }  
    53.       
    54.     sockfd = socket(AF_INET, SOCK_DGRAM, 0);  
    55.     if (sockfd < 0)  
    56.     {  
    57.         perror("socket failed");  
    58.         return;  
    59.     }  
    60.       
    61.     ifc.ifc_len = BUFFERSIZE;  
    62.     ifc.ifc_buf = buffer;  
    63.       
    64.     if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0)  
    65.     {  
    66.         perror("ioctl error");  
    67.         return;  
    68.     }  
    69.       
    70.     lastname[0] = 0;  
    71.       
    72.     for (ptr = buffer; ptr < buffer + ifc.ifc_len; )  
    73.     {  
    74.         ifr = (struct ifreq *)ptr;  
    75.         len = max(sizeof(struct sockaddr), ifr->ifr_addr.sa_len);  
    76.         ptr += sizeof(ifr->ifr_name) + len;    // for next one in buffer  
    77.           
    78.         if (ifr->ifr_addr.sa_family != AF_INET)  
    79.         {  
    80.             continue;    // ignore if not desired address family  
    81.         }  
    82.           
    83.         if ((cptr = (char *)strchr(ifr->ifr_name, ':')) != NULL)  
    84.         {  
    85.             *cptr = 0;        // replace colon will null  
    86.         }  
    87.           
    88.         if (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == 0)  
    89.         {  
    90.             continue;    /* already processed this interface */  
    91.         }  
    92.           
    93.         memcpy(lastname, ifr->ifr_name, IFNAMSIZ);  
    94.           
    95.         ifrcopy = *ifr;  
    96.         ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy);  
    97.         flags = ifrcopy.ifr_flags;  
    98.         if ((flags & IFF_UP) == 0)  
    99.         {  
    100.             continue;    // ignore if interface not up  
    101.         }  
    102.           
    103.         if_names[nextAddr] = (char *)malloc(strlen(ifr->ifr_name)+1);  
    104.         if (if_names[nextAddr] == NULL)  
    105.         {  
    106.             return;  
    107.         }  
    108.         strcpy(if_names[nextAddr], ifr->ifr_name);  
    109.           
    110.         sin = (struct sockaddr_in *)&ifr->ifr_addr;  
    111.         strcpy(temp, inet_ntoa(sin->sin_addr));  
    112.           
    113.         ip_names[nextAddr] = (char *)malloc(strlen(temp)+1);  
    114.         if (ip_names[nextAddr] == NULL)  
    115.         {  
    116.             return;  
    117.         }  
    118.         strcpy(ip_names[nextAddr], temp);  
    119.           
    120.         ip_addrs[nextAddr] = sin->sin_addr.s_addr;  
    121.           
    122.         ++nextAddr;  
    123.     }  
    124.       
    125.     close(sockfd);  
    126. }  
    127.   
    128. void GetHWAddresses()  
    129. {  
    130.     struct ifconf ifc;  
    131.     struct ifreq *ifr;  
    132.     int i, sockfd;  
    133.     char buffer[BUFFERSIZE], *cp, *cplim;  
    134.     char temp[80];  
    135.       
    136.     for (i=0; i<MAXADDRS; ++i)  
    137.     {  
    138.         hw_addrs[i] = NULL;  
    139.     }  
    140.       
    141.     sockfd = socket(AF_INET, SOCK_DGRAM, 0);  
    142.     if (sockfd < 0)  
    143.     {  
    144.         perror("socket failed");  
    145.         return;  
    146.     }  
    147.       
    148.     ifc.ifc_len = BUFFERSIZE;  
    149.     ifc.ifc_buf = buffer;  
    150.       
    151.     if (ioctl(sockfd, SIOCGIFCONF, (char *)&ifc) < 0)  
    152.     {  
    153.         perror("ioctl error");  
    154.         close(sockfd);  
    155.         return;  
    156.     }  
    157.       
    158.     ifr = ifc.ifc_req;  
    159.       
    160.     cplim = buffer + ifc.ifc_len;  
    161.       
    162.     for (cp=buffer; cp < cplim; )  
    163.     {  
    164.         ifr = (struct ifreq *)cp;  
    165.         if (ifr->ifr_addr.sa_family == AF_LINK)  
    166.         {  
    167.             struct sockaddr_dl *sdl = (struct sockaddr_dl *)&ifr->ifr_addr;  
    168.             int a,b,c,d,e,f;  
    169.             int i;  
    170.               
    171.             strcpy(temp, (char *)ether_ntoa(LLADDR(sdl)));  
    172.             sscanf(temp, "%x:%x:%x:%x:%x:%x", &a, &b, &c, &d, &e, &f);  
    173.             sprintf(temp, "%02X:%02X:%02X:%02X:%02X:%02X",a,b,c,d,e,f);  
    174.               
    175.             for (i=0; i<MAXADDRS; ++i)  
    176.             {  
    177.                 if ((if_names[i] != NULL) && (strcmp(ifr->ifr_name,if_names[i]) == 0))  
    178.                 {  
    179.                     if (hw_addrs[i] == NULL)  
    180.                     {  
    181.                         hw_addrs[i] = (char *)malloc(strlen(temp)+1);  
    182.                         strcpy(hw_addrs[i], temp);  
    183.                         break;  
    184.                     }  
    185.                 }  
    186.             }  
    187.         }  
    188.         cp += sizeof(ifr->ifr_name) + max(sizeof(ifr->ifr_addr), ifr->ifr_addr.sa_len);  
    189.     }  
    190.       
    191.     close(sockfd);  
    192. }  


    然后就是调用了,首先在我们的类里面导入上面那个类,之后在实现文件里写函数

    1. - (NSString *)deviceIPAdress {  
    2.     InitAddresses();  
    3.     GetIPAddresses();  
    4.     GetHWAddresses();  
    5.     return [NSString stringWithFormat:@"%s", ip_names[1]];  
    6. }  


    然后在我们需要获得ip的地方写上

    1. NSString* myip = [self deviceIPAdress];  

    这里的myip就是我们需要的ip地址了

    手机截图

    程序打印截图

  • 相关阅读:
    希尔排序例子
    C
    重构最大堆的例子
    基于堆的优先队列和用优先队列排序的例子
    堆排序例子
    分治法示例
    三路划分的快速排序算法
    二叉搜索例子
    标准快速排序
    【转载】JAVA5新特性
  • 原文地址:https://www.cnblogs.com/Camier-myNiuer/p/4110277.html
Copyright © 2011-2022 走看看