您的位置:首页 > 移动开发 > IOS开发

iOS 获取手机设备IP地址的两种方法

2016-12-15 18:54 633 查看
转自:http://blog.sina.com.cn/s/blog_b0b335e20102y3im.html

整理了两个能有效获取手机设备IP地址的方法,分享给大家。

友情提示:两种方法都必须在设备联网的情况下才能成功获取IP。

微博地址:http://blog.sina.com.cn/s/blog_b0b335e20102y3im.html

一,方法一​

1,引入头文件 import,五个





2,代码实现

- (NSString *)getDeviceIPIpAddresses

{

    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    if (sockfd <</span> 0) returnnil;

    NSMutableArray *ips = [NSMutableArray array];

    

    int BUFFERSIZE = 4096;

    structifconf ifc;

    char buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr;

    structifreq *ifr, ifrcopy;

    ifc.ifc_len = BUFFERSIZE;

    ifc.ifc_buf = buffer;

    if (ioctl(sockfd, SIOCGIFCONF, &ifc) >= 0){

        for (ptr = buffer; ptr < buffer + ifc.ifc_len; ){

            ifr = (structifreq *)ptr;

            int len = sizeof(struct sockaddr);

            if (ifr->ifr_addr.sa_len > len) {

                len = ifr->ifr_addr.sa_len;

            }

            ptr += sizeof(ifr->ifr_name) + len;

            if (ifr->ifr_addr.sa_family != AF_INET) continue;

            if ((cptr = (char *)strchr(ifr->ifr_name, ':')) != NULL) *cptr = 0;

            if (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == 0) continue;

            memcpy(lastname, ifr->ifr_name, IFNAMSIZ);

            ifrcopy = *ifr;

            ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy);

            if ((ifrcopy.ifr_flags & IFF_UP) == 0) continue;

            

            NSSt
4000
ring *ip = [NSString  stringWithFormat:@"%s", inet_ntoa(((struct sockaddr_in*)&ifr->ifr_addr)->sin_addr)];

            [ips addObject:ip];

        }

    }

    close(sockfd);

    

    

    NSString *deviceIP = @"";

    for (int i=0; i < ips.count; i++)

    {

        if (ips.count > 0)

        {

            deviceIP = [NSString stringWithFormat:@"%@",ips.lastObject];

            

        }

    }

    return deviceIP;

}

3,调用,得到IP

NSString *deviceIP_01 = [self  getDeviceIPAddress];

 NSLog(@"deviceIP: %@",deviceIP_01);

​二,方法二

1,include 头文件

​#include "IPAddress.h"



2,代码实现

- (NSString*)getDeviceIPAddress

{

    InitAddresses();

    GetIPAddresses();

    GetHWAddresses();

    

    int i;

    NSString *deviceIP = nil;

    

    for (i=0; i<</span>MAXADDRS; ++i)

    {

        static unsigned  long localHost = 0x7F000001;            // 127.0.0.1

        unsigned long theAddr;

        

        theAddr = ip_addrs[i];

        

        if (theAddr == 0) break;

        if (theAddr == localHost) continue;

        

        NSString *ifName = [NSString  stringWithFormat:@"%s",if_names[i]];

        

        

        if ([ifName isEqualToString:@"en0"])

        {

            deviceIP = [NSString stringWithFormat:@"%s",ip_names[i]];;

        }

        

    }

    

    //save deviceIP

    if (deviceIP.length > 1)

    {

        [[NSUserDefaultsstandardUserDefaults] setObject:deviceIP forKey:@"deviceIP"];

    }

    return deviceIP;

}

​​

​3,调用

​NSString *deviceIP = [self getDeviceIPAddress];

NSLog(@"deviceIP: %@",deviceIP);

4,IPAddress 文件代码

(1)IPAddress.h

//

//  IPAddress.h

//  MiniSoft

//

//  Created by cherish on 15/9/16.

//  Copyright (c) 2015年 nike_hu. All rights reserved.

//

#ifndef __MiniSoft__IPAddress__

#define __MiniSoft__IPAddress__

#include

#define MAXADDRS    32

externchar *if_names[MAXADDRS];

externchar *ip_names[MAXADDRS];

externchar *hw_addrs[MAXADDRS];

externunsignedlong ip_addrs[MAXADDRS];

// Function prototypes

void InitAddresses();

void FreeAddresses();

void GetIPAddresses();

void GetHWAddresses();

#endif



(2)IPAddress.m

​//

//  IPAddress.c

//  MiniSoft

//

//  Created by cherish on 15/9/16.

//  Copyright (c) 2015年 nike_hu. All rights reserved.

//

#include "IPAddress.h"

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include "IPAddress.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];

unsignedlong ip_addrs[MAXADDRS];

staticint   nextAddr = 0;

void InitAddresses()

{

    int i;

    for (i=0; i<</span>MAXADDRS; ++i)

    {

        if_names[i] = ip_names[i] = hw_addrs[i] = NULL;

        ip_addrs[i] = 0;

    }

}

void FreeAddresses()

{

    int i;

    for (i=0; i<</span>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;

    structifconf       ifc;

    structifreq        *ifr, ifrcopy;

    structsockaddr_in  *sin;

    

    char temp[80];

    

    int sockfd;

    

    for (i=0; i<</span>MAXADDRS; ++i)

    {

        if_names[i] = ip_names[i] = NULL;

        ip_addrs[i] = 0;

    }

    

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    if (sockfd <</span> 0)

    {

        perror("socket failed");

        return;

    }

    

    ifc.ifc_len = BUFFERSIZE;

    ifc.ifc_buf = buffer;

    

    if (ioctl(sockfd, SIOCGIFCONF, &ifc) <</span> 0)

    {

        perror("ioctl error");

        return;

    }

    

    lastname[0] = 0;

    

    for (ptr = buffer; ptr < buffer + ifc.ifc_len; )

    {

        ifr = (structifreq *)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;

        }

        

        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 = (structsockaddr_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()

{

    structifconf ifc;

    structifreq *ifr;

    int i, sockfd;

    char buffer[BUFFERSIZE], *cp, *cplim;

    char temp[80];

    

    for (i=0; i<</span>MAXADDRS; ++i)

    {

        hw_addrs[i] = NULL;

    }

    

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    if (sockfd <</span> 0)

    {

        perror("socket failed");

        return;

    }

    

    ifc.ifc_len = BUFFERSIZE;

    ifc.ifc_buf = buffer;

    

    if (ioctl(sockfd, SIOCGIFCONF, (char *)&ifc) <</span> 0)

    {

        perror("ioctl error");

        close(sockfd);

        return;

    }

    

    ifr = ifc.ifc_req;

    

    cplim = buffer + ifc.ifc_len;

    

    for (cp=buffer; cp < cplim; )

    {

        ifr = (structifreq *)cp;

        if (ifr->ifr_addr.sa_family == AF_LINK)

        {

            structsockaddr_dl *sdl = (structsockaddr_dl *)&ifr->ifr_addr;

            int a,b,c,d,e,f;

            int i;

            

            strcpy(temp, (char *)ether_ntoa((conststruct ether_addr *)LLADDR(sdl)));

            sscanf(temp, "%x:%x:%x:%x:%x:%x", &a, &b, &c, &d, &e, &f);

            sprintf(temp, "X:X:X:X:X:X",a,b,c,d,e,f);

            

            for (i=0; i<</span>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);

}

希望对你有帮助,不喜勿喷。

地址:http://blog.sina.com.cn/s/blog_b0b335e20102y3im.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: