取iphone本機ip地址方法(非調用私人api方法)

來源:互聯網
上載者:User

#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 (

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.