取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
- 取iphone本机ip地址方法(非调用私有api方法)
- 取iphone本机ip地址方法(非调用私有api方法)
- 取iphone本机ip地址方法(非调用私有api方法)
- 取iphone本机ip地址方法(非调用私有api方法)
- 获取iphone ip 非私有方法 iphone xcode
- 得到本机IP非127.0.0.1地址的方法
- 不调用苹果似有API也能获取 iPhone 本机 IP 地址的
- python取本地mac地址,ip地址,非ipconfig方法
- 获取本机IP地址的方法:
- java获取本机ip地址方法
- socket获取本机IP地址方法
- Mac查看本机IP地址方法
- Java获取本机IP地址方法。
- JAVA与Jsp取本机ip地址的正确方法,ipv6有效
- Android获取本机Mac地址及IP地址方法
- android:获取本机Mac地址及IP地址方法
- Android获取本机Mac地址及IP地址方法
- Android 获取本机Mac 地址方法及ip地址
- QGraphicItem, 拖拽窗口大小例子
- 应用监控报警设置的发展
- 浅析C++的构造函数,拷贝构造函数和赋值运算符 .
- 蹲墙角哭伤感QQ心情日志-当爱有了距离后
- magento 发邮件SMTP插件
- 取iphone本机ip地址方法(非调用私有api方法)
- 获取ping不通的IP地址
- 高数第四五章 不定积分与定积分
- WIN7下安装VC6.0并建立工程
- Android中高效的显示图片之三——缓存图片
- java数组静态初始化区别(内存方面)
- mount: RPC: Unable to receive; errno = No route to host
- 错误!!!!!
- 网络伤感生活日志发布:来不及凋谢的花落