iphone的IP地址源码

定义了几个方法,获取iphone的IP地址。

IPAdress.h

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

IPAddress.c

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

如何用呢, 我们在MyAppAppDelegate.h中如下

  1. #import <UIKit/UIKit.h>  
  2. @interface MyAppAppDelegate : NSObject <UIApplicationDelegate> {  
  3.     NSString *localIP;  
  4. }  
  5. @property (nonatomic, retain) NSString *localIP;  
  6. - (NSString *)deviceIPAdress;  
  7. @end  
 

MyAppDelegate.m

  1. - (void)applicationDidFinishLaunching:(UIApplication *)application {  
  2.     self.localIP = [self deviceIPAdress];  
  3.         ...  
  4. }  
  5. - (NSString *)deviceIPAdress {  
  6.     InitAddresses();  
  7.     GetIPAddresses();  
  8.     GetHWAddresses();  
  9.       
  10.         /*  
  11.     int i; 
  12.     NSString *deviceIP; 
  13.     for (i=0; i<MAXADDRS; ++i) 
  14.     { 
  15.         static unsigned long localHost = 0x7F000001;        // 127.0.0.1 
  16.         unsigned long theAddr; 
  17.          
  18.         theAddr = ip_addrs[i]; 
  19.          
  20.         if (theAddr == 0) break; 
  21.         if (theAddr == localHost) continue; 
  22.          
  23.         NSLog(@"%s %s %s/n", if_names[i], hw_addrs[i], ip_names[i]); 
  24.     } 
  25.     deviceIP = [NSString stringWithFormat:@"%s", ip_names[i]]; 
  26.     */  
  27.       
  28.         //this will get you the right IP from your device in format like 198.111.222.444. If you use the for loop above you will se that ip_names array will also contain localhost IP 127.0.0.1 that's why I don't use it. Eventualy this was code from mac that's why it uses arrays for ip_names as macs can have multiple IPs  
  29.     return [NSString stringWithFormat:@"%s", ip_names[1]];  
  30. }
posted @ 2011-07-09 10:44  周宏伟  阅读(2067)  评论(0编辑  收藏  举报