第一种方法是用系统api的方式获取,如下
这样得到的ip,如果在内网中,那么就是内网的ip.
第二种方法是可以获取公网ip
用到了ASIHTTPRequest这个网络开源库。
http://automation.whatismyip.com/n09230945.asp这个http url就可以获取你当前的ip地址。
#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,如果在内网中,那么就是内网的ip.
第二种方法是可以获取公网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这个网络开源库。
http://automation.whatismyip.com/n09230945.asp这个http url就可以获取你当前的ip地址。
发表评论
-
如何使用AV Foundation从摄像头将视频帧捕获为图像
2012-11-15 17:21 7460如果译错,感谢指出。 英文原文地址:https://d ... -
iOS单元测试
2012-11-05 11:37 921转自:http://www.cnblogs.com/ke ... -
Core Data数据持久化的使用
2012-10-30 21:31 1050CoreData 是ios中用来对数据做持久化的一个框架 ... -
ASIHTTPRequest缓存策略的设置
2012-10-30 17:23 3876ASIHTTPRequest 是一款强大的网络请求框架,该框架 ... -
【无限互联】xcode自定义类的模板
2012-10-23 19:37 1161翻译:http://www.bobmccune.com/ ... -
【无限互联】适配iOS6和iPhone5屏幕
2012-10-23 18:05 24771. iOS6的mo模拟器比较大,通过comman ... -
【无限互联】mac下配置svn服务器
2012-10-22 13:30 773在mac下配置svn服务器其实很简单,只需要简单的几句命令就可 ... -
【无限互联】iOS开发之多线程开发
2012-10-10 17:41 1238本节要点: 1.多线程的概念 2.掌握iOS中多线程 ... -
【无限互联】iOS开发block用法之UIAlertView控件的修改
2012-10-10 17:06 2689原始的UIAlertView的需要通过委托方法来实现按钮 ... -
Objective-C新特性
2012-09-05 14:38 707基于Xcode4.4(不完全独有)。1. 成员方法无需前置声明 ... -
iphone-NSDate日期处理
2012-08-31 16:25 1071NSDate存储的是世界标准时(UTC),输出时需要 ... -
iphone开发资源汇总
2012-08-31 16:16 1623如何用Facebook graphic api上传视 ... -
iOS-如何让xcode自动检查内存泄露
2012-08-31 16:05 1097在project-setting中找到 “Run Static ... -
UIScrollView的属性总结
2012-02-08 15:58 4435在滚动过程当中,其实是在修改原点坐标 当手指触摸后, scr ... -
iPhone开发之 ARC是什么
2012-01-17 16:58 1385相关链接:http://blog.csdn ... -
画图时 自己做的一小笔记
2012-01-07 21:02 9670 CGContextRef context = UIGra ... -
让Xcode 4.2生成的app支持旧版iOS设备(armv6)
2012-01-07 00:46 1340这几天遇到一个非常奇怪的问题,基于Xcode 4.2开发的ap ... -
5个开源库的JSON解析速度测试
2011-12-03 23:15 1460iOS5新增了JSON解析的API ... -
Quartz 2D编程指南(2) - 图形上下文(Graphics Contexts)
2011-11-12 00:08 1457一个Graphics Context表示一 ... -
Quartz 2D编程指南(1) - 概览
2011-11-11 23:57 1720Quartz 2D是一个二维图形绘制引擎,支持iOS环境和Ma ...
相关推荐
在iOS开发中,获取用户设备当前的IP地址是一项常见的需求,这可以帮助开发者了解应用的网络环境,例如在实现网络诊断、远程服务连接或者位置定位等功能时。本文将详细讲解如何在iOS应用中获取设备的IP地址。 首先,...
获取本地IP地址通常是指获取设备当前活动网络接口的IP。 **获取本地IP地址** 在iOS中,我们可以使用`SystemConfiguration`框架的`CFNetwork`库来获取本地IP。具体步骤如下: 1. 引入`SystemConfiguration`框架: `...
在iOS开发中,有时我们需要获取设备当前连接的WiFi网络信息,包括WiFi的SSID(服务集标识,即WiFi名称)和设备的IP地址。本篇文章将详细介绍如何通过Objective-C实现这一功能。 首先,为了获取设备的本地IP地址,...
IP地址(Internet Protocol Address)是互联网上的设备在网络层的唯一标识,它用于区分网络上的不同节点。而MAC地址(Media Access Control Address)则是数据链路层的物理地址,通常用于局域网内的设备识别,每一个...
获取手机IP各种地址,网上都是获取局域网的ip,写了一个能真正获取手机的各种iP各种地址。
在iOS开发中,获取设备的硬件信息和IP地址是常见的需求,这可以帮助开发者更好地了解运行应用的设备状态,或者实现特定的功能,如网络诊断。在Swift中,我们可以编写工具类来方便地获取这些信息。以下将详细介绍如何...
2. **移动终端IP**:获取设备的IP地址通常需要使用`CFNetwork`框架中的`CFHost`或`CFNetService`。通过`CFNetwork`的API,可以查询设备的IPv4或IPv6地址。 3. **地理位置信息**:地理位置信息的获取主要依赖于`...
发现是基于arp来和路由器交互然后获取当前路由器下的缓存设备表,然后我们就可以根据ip来判断本机mac地址了。但是我发现这个缓存表数据时多时少,很难找全,但fing却可以。所以希望靠大家的力量一起来研究分享!
在iOS开发中,获取设备的信息,如WiFi名称、UUID(Universally Unique Identifier)以及IP地址,是常见的需求。这些信息对于应用的个性化设置、设备跟踪和网络通信等场景至关重要。以下将详细介绍如何在iOS中获取...
- 获取设备的本地IP地址,如果得到的是IPv6地址,那么设备当前可能使用的是IPv6网络;反之,如果是IPv4,则设备使用IPv4网络。这可以通过`System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces...
本文将详细阐述如何获取计算机器的IP地址(包括公网IP和内网IP)以及主机名。 首先,让我们理解IP地址的基本概念。IP地址(Internet Protocol Address)是互联网上的设备唯一标识,类似于我们现实世界的邮政地址。...
在iOS开发中,有时我们需要获取设备的IP地址,例如用于网络通信或诊断网络连接问题。本文将详细讲解如何在Objective-C中实现获取iOS设备的IP地址,并提供具体代码实例。 首先,我们需要引入两个系统框架头文件`...
在iOS开发中,获取设备的本地IP地址是常见的需求,特别是在网络编程或者设备间通信时。这个主题主要涉及iPhone开发中的网络编程知识,主要利用Objective-C语言实现。下面将详细介绍如何通过源代码获取iPhone的本地IP...
在iOS开发中,获取设备的IP地址和当前连接的Wi-Fi网络SSID是常见的需求,这有助于实现设备间的网络通信、定位服务或者网络诊断等功能。本文将深入探讨如何在iOS应用中实现这一目标。 首先,我们需要了解两个核心...
IP地址作为上网设备在网络世界中的唯一标识,其重要性不言而喻。为了应对这一需求,各种网络工具应运而生,其中,“IP地址更换器”这一软件工具,凭借其方便快捷的特性,受到了众多用户的青睐。 IP地址更换器的主要...
这段代码会遍历当前设备的所有网络接口,并从中提取出DNS服务器的IPv6地址。`CNCopySupportedInterfaces()` 返回可用的网络接口列表,`CNCopyCurrentNetworkInfo()` 提供了接口的详细信息,包括DNS服务器地址。 在...
在iOS中,可以通过`CTBonjour`或者`Reachability`库来获取设备的IP地址。例如,使用`Reachability`库可以监听网络状态变化,并获取到当前设备的IPv4或IPv6地址。 4. **设备型号**: 获取设备型号通常是为了解决设备...