返回顶部

收藏

获取 iOS 设备当前 ip 地址

更多

[C/C++]代码

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

    //#include "GetAddresses.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);  
    }  

    - (NSString *)deviceIPAdress {  
        InitAddresses();  
        GetIPAddresses();  
        GetHWAddresses();  

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

第二种方法是可以获取公网ip

    - (void)getCurrentIP  
    {  
        NSURL *url = [NSURL URLWithString:@"http://automation.whatismyip.com/n09230945.asp"];  
        __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];  
        [request setCompletionBlock:^{  
            NSString *responseString = [request responseString];  
            if (responseString) {  

                NSString *ip = [NSString stringWithFormat:@"%@", responseString];  

                NSLog(@"responseString = %@", ip);  
            };  

        }];  

        [request setFailedBlock:^{  
        }];  
    }  
//用到了ASIHTTPRequest这个网络开源库。 获取你当前的ip地址。

标签:iOS,Objective-C,IP

收藏

0人收藏

支持

0

反对

0

发表评论