`
jsntghf
  • 浏览: 2527608 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

获取IP地址

    博客分类:
  • iOS
阅读更多

IPAddress.h

 

#define MAXADDRS    32  

extern char *if_names[MAXADDRS];  
extern char *ip_names[MAXADDRS];  
extern char *hw_addrs[MAXADDRS];  
extern unsigned long ip_addrs[MAXADDRS];  

void InitAddresses();  
void FreeAddresses();  
void GetIPAddresses();  
void GetHWAddresses();

 

IPAddress.c

 

#include "IPAddress.h"  

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

#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;     
        
        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);  
        flags = ifrcopy.ifr_flags;  
        if ((flags & IFF_UP) == 0) {  
            continue;      
        }  
        
        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]];  
} 

- (void)viewDidLoad {
	NSString* address = [self deviceIPAdress];
	NSString* myIPAdress = [NSString stringWithFormat:@"IP Address: %@", address];
	textView.text = myIPAdress;
}
分享到:
评论

相关推荐

    pb获取ip地址/mac地址

    标题中的"pb获取ip地址/mac地址"指的是在PowerBuilder(简称pb)环境下获取计算机的IP地址和MAC地址。PowerBuilder是一种流行的.NET和Java应用程序开发工具,尤其适合于创建数据库驱动的应用程序。在这个场景中,...

    java获取ip地址

    ### Java获取IP地址知识点解析 在本篇文章中,我们将深入探讨如何使用Java语言来获取IP地址。这是一项在网络编程中非常基础且重要的技能,能够帮助开发者了解客户端或服务器的网络位置信息。以下是对给定文件中的...

    故障处理-用户无法获取IP地址.pdf

    在处理网络故障时,用户无法获取IP地址是一个常见问题,尤其涉及到DHCP(Dynamic Host Configuration Protocol)客户端无法从DHCP服务器获取IP地址的情况。DHCP协议使得网络设备能够动态地从服务器获取IP地址配置...

    非request方式获取IP地址

    ### 非request方式获取IP地址 #### 1. 方法概述 本示例中的`getIp()`方法采用Java标准库中的`java.net.InetAddress`类来获取本地主机的IP地址。这种方法避免了使用HTTP请求或套接字连接所带来的复杂性,提供了一种...

    PB11.5获取IP地址及主机名

    在PowerBuilder 11.5(PB11.5)中获取IP地址和主机名是应用程序与网络通信的基础。这通常涉及到系统编程和网络API的使用。以下是对这个主题的详细解释。 首先,我们需要理解IP地址和主机名的概念。IP地址(Internet...

    idea,java获取ip地址

    2. **获取IP地址**:`HttpServletRequest`对象有一个`getRemoteAddr()`方法,它返回客户端的IP地址。然而,如果应用运行在反向代理服务器(如Nginx)后,这个方法可能会返回代理服务器的IP。因此,我们需要检查`X-...

    自动获取ip地址的BAT批处理

    本文将深入探讨标题为“自动获取ip地址的BAT批处理”的主题,以及如何利用批处理脚本来实现这个功能。 批处理文件通常使用扩展名为`.bat`,它包含了Windows操作系统下的DOS命令。自动获取IP地址的批处理脚本主要...

    ASP.NET 获取IP地址

    ### ASP.NET中获取IP地址及地理位置的详细解析 在当今互联网时代,获取用户IP地址及其地理位置成为许多应用程序的重要功能之一,特别是在网络安全、数据分析、个性化服务等领域。本文将深入探讨如何在ASP.NET应用中...

    C++获取IP地址

    在MFC中,我们可以创建一个对话框类(CDialog-derived class),并在其中添加按钮或控件用于触发获取IP地址的操作。以下是一个简单的步骤概述: 1. **设置项目**: 创建一个新的MFC对话框应用程序,选择“MFC ...

    php获取IP地址类库

    3. **注意事项**:解释在某些网络环境下(如NAT、代理服务器)获取IP地址的复杂性,以及如何处理这些情况。 4. **兼容性**:列出支持的PHP版本和其他依赖项,以及可能的环境限制。 5. **许可证信息**:提供类库的...

    西门子200Smart怎么获取IP地址和设置IP地址[归纳].pdf

    "西门子200Smart获取IP地址和设置IP地址的相关知识点" 获取IP地址和设置IP地址的重要性 在工业自动化领域,获取IP地址和设置IP地址是非常重要的步骤,它们可以确保PLC(Programmable Logic Controller)能够正确地...

    Qt获取IP地址、MAC地址等网卡信息,区分本地网卡、无线网卡和虚拟网卡

    在Unix-like系统中,可以使用`getifaddrs()`函数来遍历所有网络接口,并通过`ifa_addr`字段获取IP地址。在Windows中,可以使用`GetAdaptersAddresses()`函数,同样通过遍历结果来获取IP地址。IP地址通常有IPv4和...

    通过计算机获取IP地址

    注意,获取IP地址时可能需要管理员权限,因为访问网络信息可能受到操作系统安全策略的限制。此外,如果计算机连接了多个网络(如有线和无线网络),那么可能会得到多个IP地址。 总结来说,通过C#编程,我们可以利用...

    C++获取IP地址代码

    4. **提取IP地址**:从`hostEntry`或`addrList`结构中,可以获取IP地址。如果是`gethostbyname()`,可以从`hostEntry-&gt;h_addr_list`获取;如果是`getaddrinfo()`,则遍历`addrList`,从`ai_addr`字段提取。 ```cpp ...

    获取IP地址及主机名

    总之,获取IP地址和主机名是网络通信的基础操作,无论是开发、运维还是日常使用,都经常需要用到。通过了解并熟练掌握这些方法,可以更好地理解和管理网络连接。同时,公网IP和内网IP的区分对于理解网络架构和安全也...

    LabVIEW获取IP地址

    LabVIEW自动检测获取本机IP地址。 项目可直接运行~

    获取Ip地址代码

    在IT行业中,获取IP地址是一项基础且重要的任务,特别是在网络编程和服务器开发中。IP地址是互联网协议(IP)中的一个关键元素,用于唯一标识网络上的设备。在本文中,我们将详细探讨如何在不同的编程语言中获取IP...

    获取IP地址,MAC地址

    本项目“获取IP地址,MAC地址”利用MFC和`netapi32.lib`库来实现获取网络适配器的IP和MAC信息。下面我们将详细探讨这个过程中的关键知识点。 首先,我们需要了解`netapi32.lib`库。这是一个Windows API库,提供了对...

    JS获取ip地址归属地

    JS 获取 IP 地址归属地 在网络开发中,获取用户的 IP 地址归属地是非常有用的功能,例如在电商平台中可以根据用户的 IP 地址归属地进行物流信息的显示和管理。在这篇文章中,我们将使用 JS 调用第三方 API 获取 IP ...

Global site tag (gtag.js) - Google Analytics