取iphone本机ip地址方法(非调用私有api方法)

来源:互联网 发布:ipad进销存软件哪个好 编辑:程序博客网 时间:2024/05/16 08:09
私有方法:NSHost* myhost =[NSHost currentHost];NSString *ad = [myhost address]; As far as I know there is only one hacky way to do that. You basically open a socket and get its address using POSIX functions. Here is the code I used for this:/* *  IPAdress.h * * */  #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 * */  #include " IPAddress.h "  #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 >   #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 ) ;}  Test:#import " IPAdress.h " ..........- ( NSString * ) deviceIPAdress {      InitAddresses () ;     GetIPAddresses () ;     GetHWAddresses () ;     return [ NSString stringWithFormat :@ " %s " , ip_names [ 1 ]] ;}  - ( void ) viewDidLoad {      [ super viewDidLoad ] ;      NSString * ip_iphone = [ self deviceIPAdress ] ;   NSLog ( @ " ip:%@ " , ip_iphone ) ;}

Implicit declaration of function 'ether_ntoa' is invalid in C99

解决办法:http://stackoverflow.com/questions/11245280/implicit-declaration-of-function-ether-ntoa-is-invalid-in-c99

转自:http://blog.csdn.net/toddfox/article/details/5619890

原创粉丝点击