- 私有方法:
- 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