你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 獲取iphone的IP地址源碼

獲取iphone的IP地址源碼

編輯:IOS開發綜合
 定義了幾個方法,獲取iphone的IP地址。 IPAdress.h [cpp]   #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();      IPAddress.c [c-sharp]   #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);     }           如何用呢, 我們在MyAppAppDelegate.h中如下   [c-sharp]   #import <UIKit/UIKit.h>     @interface MyAppAppDelegate : NSObject <UIApplicationDelegate> {         NSString *localIP;     }     @property (nonatomic, retain) NSString *localIP;     - (NSString *)deviceIPAdress;     @end       MyAppDelegate.m [c-sharp]   - (void)applicationDidFinishLaunching:(UIApplication *)application {         self.localIP = [self deviceIPAdress];             ...     }     - (NSString *)deviceIPAdress {         InitAddresses();         GetIPAddresses();         GetHWAddresses();                      /*        int i;       NSString *deviceIP;       for (i=0; i<MAXADDRS; ++i)       {           static unsigned long localHost = 0x7F000001;        // 127.0.0.1           unsigned long theAddr;                      theAddr = ip_addrs[i];                      if (theAddr == 0) break;           if (theAddr == localHost) continue;                      NSLog(@"%s %s %s/n", if_names[i], hw_addrs[i], ip_names[i]);       }       deviceIP = [NSString stringWithFormat:@"%s", ip_names[i]];       */                      //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         return [NSString stringWithFormat:@"%s", ip_names[1]];     }    
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved