zoukankan      html  css  js  c++  java
  • 获取ios设备的当前IP地址

    目前项目中,项目要求所有发送到服务端的请求,要求把客户端的ip地址作为参数也发送过去。

    IPAddress.h

    //
    //  ZFIPAddress.h
    //  MyStudyDemo
    //
    //  Created by FranZhou on 16/6/23.
    //  Copyright © 2016年 kimree. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    @interface ZFIPAddress : NSObject
    
    +(NSString*) getIpAddress;
    
    +(NSString *)getIPAddress;
    
    @end
    

      

      

    IPAddress.m

    //
    //  ZFIPAddress.m
    //  MyStudyDemo
    //
    //  Created by FranZhou on 16/6/23.
    //  Copyright © 2016年 kimree. All rights reserved.
    //
    
    #import "ZFIPAddress.h"
    
    // getIpAddress
    #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 <net/ethernet.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>
    
    // getIPAddress
    #import <ifaddrs.h>
    #import <arpa/inet.h>
    
    #define min(a,b)    ((a) < (b) ? (a) : (b))
    #define max(a,b)    ((a) > (b) ? (a) : (b))
    
    #define BUFFERSIZE  4000
    #define MAXADDRS  256
    
    char *if_names[MAXADDRS];
    char *ip_names[MAXADDRS];
    char *hw_addrs[MAXADDRS];
    unsigned long ip_addrs[MAXADDRS];
    static int   nextAddr = 0;
    
    @implementation ZFIPAddress
    
    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((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);
    }
    
    +(NSString*) getIpAddress
    {
        InitAddresses();
        GetIPAddresses();
        NSString* ipAddress = [NSString stringWithFormat:@"%s", ip_names[1]];
        FreeAddresses();
        
        return ipAddress;
    }
    
    
    // Get IP Address
    +(NSString *)getIPAddress {
        NSString *address = @"error";
        struct ifaddrs *interfaces = NULL;
        struct ifaddrs *temp_addr = NULL;
        int success = 0;
        // retrieve the current interfaces - returns 0 on success
        success = getifaddrs(&interfaces);
        if (success == 0) {
            // Loop through linked list of interfaces
            temp_addr = interfaces;
            while(temp_addr != NULL) {
                if(temp_addr->ifa_addr->sa_family == AF_INET) {
                    // Check if interface is en0 which is the wifi connection on the iPhone
                    if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {
                        // Get NSString from C String
                        address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
                    }
                }
                temp_addr = temp_addr->ifa_next;
            }
        }
        // Free memory
        freeifaddrs(interfaces);
        return address;
        
    }
    
    
    @end
    

      

    swift实现方法如下:

    //
    //  ZFIPAddress.swift
    //  MyStudyDemo
    //
    //  Created by FranZhou on 16/6/23.
    //  Copyright © 2016年 kimree. All rights reserved.
    //
    
    import Foundation
    
    /*
        桥接文件中需要包含以下内容
        #import <ifaddrs.h>
        #import <arpa/inet.h>
     */
    
    
    public func getIPAddress() -> String?{
        var ipAddress: String? = nil
        
        var interfaces: UnsafeMutablePointer<ifaddrs> = nil
        var temp_addr: UnsafeMutablePointer<ifaddrs> = nil
        var success: Int32 = 0
        
        // retrieve the current interfaces - returns 0 on success
        success = getifaddrs(&interfaces)
        if success == 0 {
            // Loop through linked list of interfaces
            temp_addr = interfaces
            while temp_addr != nil {
                if Int32(temp_addr.memory.ifa_addr.memory.sa_family) == AF_INET {
                    // Check if interface is en0 which is the wifi connection on the iPhone
                    let ifa_name = String(UTF8String: temp_addr.memory.ifa_name)
                    if ifa_name != nil && ifa_name! == "en0" {
                        // Get NSString from C String
                        ipAddress = String(UTF8String: inet_ntoa((UnsafeMutablePointer<sockaddr_in>)(temp_addr.memory.ifa_addr).memory.sin_addr))
                    }
                }
                
                // next point
                temp_addr = temp_addr.memory.ifa_next
            }
        }
        freeifaddrs(interfaces)
        
        return ipAddress
    }
    

      

  • 相关阅读:
    学习:GridView中asp:BoundField的Visible=false时,无法取到这个字段的值
    C#读、写、删除注册表
    ERROR [IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序
    Gridview隐藏列的取值问题
    SQL 2005导入EXCEL
    GridView使用LinkButton和Button两种方式的删除确认
    (转)ASP.Net的AccessDataSource设置错误"未将对象引用设置到对象的实例"的解决方案
    给GridView文本加上边框
    (转)从客户端中检测到有潜在危险的 Request.Form 值
    (转)Asp.net中的ServerVariables集合
  • 原文地址:https://www.cnblogs.com/FranZhou/p/5610839.html
Copyright © 2011-2022 走看看