关闭

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

319人阅读 评论(0) 收藏 举报

#import "IPAdress.h"

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

#include "unistd.h"

#import <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 <sys/types.h>

#include <sys/socket.h>

#include <net/ethernet.h>


#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((int) sizeof ( struct sockaddr ) , (int)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 ( (const struct ether_addr *)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 ) ;

}




@interface IPAdress ()


@end


@implementation IPAdress


- (void)viewDidLoad {

    [super viewDidLoad];

    

}


- ( NSString * ) deviceIPAdress {

    InitAddresses () ;

    GetIPAddresses () ;

    GetHWAddresses () ;

    return [ NSString stringWithFormat :@ " %s " , ip_names [ 1 ]] ;

}


@end

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:21057次
    • 积分:530
    • 等级:
    • 排名:千里之外
    • 原创:25篇
    • 转载:44篇
    • 译文:0篇
    • 评论:3条
    最新评论