獲取iphone的IP地址源碼 – iPhone手機開發技術文章 iPhone軟體開發教學課程

 定義瞭幾個方法,獲取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]];    

}    

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *