获取iphone的IP地址源码

转载自:http://blog.csdn.net/zougangx/article/details/6215595

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

IPAdress.h

[cpp]  view plain copy
  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

[c-sharp]  view plain copy
  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中如下

 

[c-sharp]  view plain copy
  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

[c-sharp]  view plain copy
  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. }    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值