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

原创 2016年08月30日 18:32:14

#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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

私有方法: NSHost* myhost =[NSHost currentHost]; NSString *ad = [myhost address]; As far as I know t...

JAVA与Jsp取本机ip地址的正确方法,ipv6有效

//[转]JAVA取本机ip地址的正确方法,ipv6有效 //除普通环境,还能适用于多网卡的、Linux环境 import java.net.Inet6Address; import java....
  • tanyit
  • tanyit
  • 2011-11-01 15:28
  • 5582

获取本机IP地址的方法

Android获取本机IP地址(不是localhost)和MAC的方法

这个方法在摩托罗拉里程碑上测试通过。功能是获取本机的IP和MAC地址。首先新建一个工程,修改AndroidManifest.xml文件增加用户权限,如下。       view plaincop...

Windows下获取本机IP地址方法介绍

首先说明代码来源于网络,Author: Khalid Shaikh [Shake@ShakeNet.com] if((hostinfo = gethostbyname(name)) !...

socket获取本机IP地址方法

获取计算机的名称和IP地址可以通过调用winsock里面的函数完成,下面上是用到的函数:1.WSAStartup(),此函数在应用程序中初始化windows sockets DLL,这个函数调用成功后...

linux编程获取本机IP地址的三种方法

这 是一项不太清晰而且没有多大意义的工作。一个原因是网络地址的设置非常灵活而且都是允许用户进行个性化设置的,比如一台计算机上可以有多块物理网卡或者虚 拟网卡,一个网卡上可以绑定多个IP地址,用户可...
  • jcwKyl
  • jcwKyl
  • 2011-04-14 20:33
  • 25408

获取iphone ip 非私有方法 iphone xcode

/*   *  IPAdress.h   *   *   */     #define MAXADDRS    32 &...

获取本机IP和主机名方法

  • 2012-05-15 09:45
  • 120KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)