第一种方法是用系统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 7385如果译错,感谢指出。 英文原文地址:https://d ... -
iOS单元测试
2012-11-05 11:37 869转自:http://www.cnblogs.com/ke ... -
Core Data数据持久化的使用
2012-10-30 21:31 1007CoreData 是ios中用来对数据做持久化的一个框架 ... -
ASIHTTPRequest缓存策略的设置
2012-10-30 17:23 3829ASIHTTPRequest 是一款强大的网络请求框架,该框架 ... -
【无限互联】xcode自定义类的模板
2012-10-23 19:37 1112翻译:http://www.bobmccune.com/ ... -
【无限互联】适配iOS6和iPhone5屏幕
2012-10-23 18:05 24271. iOS6的mo模拟器比较大,通过comman ... -
【无限互联】mac下配置svn服务器
2012-10-22 13:30 730在mac下配置svn服务器其实很简单,只需要简单的几句命令就可 ... -
【无限互联】iOS开发之多线程开发
2012-10-10 17:41 1205本节要点: 1.多线程的概念 2.掌握iOS中多线程 ... -
【无限互联】iOS开发block用法之UIAlertView控件的修改
2012-10-10 17:06 2619原始的UIAlertView的需要通过委托方法来实现按钮 ... -
Objective-C新特性
2012-09-05 14:38 661基于Xcode4.4(不完全独有)。1. 成员方法无需前置声明 ... -
iphone-NSDate日期处理
2012-08-31 16:25 1025NSDate存储的是世界标准时(UTC),输出时需要 ... -
iphone开发资源汇总
2012-08-31 16:16 1564如何用Facebook graphic api上传视 ... -
iOS-如何让xcode自动检查内存泄露
2012-08-31 16:05 1055在project-setting中找到 “Run Static ... -
UIScrollView的属性总结
2012-02-08 15:58 4386在滚动过程当中,其实是在修改原点坐标 当手指触摸后, scr ... -
iPhone开发之 ARC是什么
2012-01-17 16:58 1331相关链接:http://blog.csdn ... -
画图时 自己做的一小笔记
2012-01-07 21:02 9230 CGContextRef context = UIGra ... -
让Xcode 4.2生成的app支持旧版iOS设备(armv6)
2012-01-07 00:46 1283这几天遇到一个非常奇怪的问题,基于Xcode 4.2开发的ap ... -
5个开源库的JSON解析速度测试
2011-12-03 23:15 1410iOS5新增了JSON解析的API ... -
Quartz 2D编程指南(2) - 图形上下文(Graphics Contexts)
2011-11-12 00:08 1396一个Graphics Context表示一 ... -
Quartz 2D编程指南(1) - 概览
2011-11-11 23:57 1652Quartz 2D是一个二维图形绘制引擎,支持iOS环境和Ma ...
相关推荐
iOS获取用户设备当前的IP地址
提供获取本地及路由器地址、设备信息、设备方向及其他信息
本文主要介绍了iOS获取当前连接的WiFi以及IP地址方法的核心代码。具有很好的参考价值,下面跟着小编一起来看下吧
C#简单编写的一个获取本地ip,mac地址的小程序,C#简单编写的一个获取本地ip,mac地址的小程序
一个NSURLRequest,一个NSURLConnection,请求结束之后反回用户可路由IP
发现是基于arp来和路由器交互然后获取当前路由器下的缓存设备表,然后我们就可以根据ip来判断本机mac地址了。但是我发现这个缓存表数据时多时少,很难找全,但fing却可以。所以希望靠大家的力量一起来研究分享!
封装的获取ios设备的ip地址和当前网络的ssid
获取手机IP各种地址,网上都是获取局域网的ip,写了一个能真正获取手机的各种iP各种地址。
通过ip地址自动定位,然后获取到当前城市的天气。 作者说:本程序通过修改 @Chro_54294(/ios/天气/516646b06803fa100d000000)上传的代码。 小编注:感谢作者@爱疯-乐丶小宁 分享代码于Code4App。 [优才 · ...
DHCP支持3种IP地址分配机制: 1. 自动分配Automatic allocation,dhcp 分配一个永久的IP地址给...CISCO ios全面支持DHCP,支持管理分配,地址获取,如果一个DHCP服务不能满足当前要求,它可以向其他DHCP发起请求。
每日图文,图文详情,当前ip地址,往期列表,每月图文列表,图文收藏、分享 每日文章,滚动卡片,卡片详情,文章阅读,相关推荐,评论列表,每月文章列表,作者关注,文章收藏、分享 每日音乐,音乐播放,音乐故事...
IP地址小部件,该小部件显示您当前的外部IP地址,IP所在城市,ISP名称。 屏幕截图中的IP仅具有代表性。工厂监控器小部件Plant Monitor Widget ,这是一个通过JSON从本地IOT设备获取信息并将其显示在窗口小部件中的...
路由器的Ethernet 0端口为inside端口,即此端口连接内部网络,并且此端口所连接的网络应该被翻译,Serial 0端口为outside端口,其拥有合法IP地址(由NIC或服务提供商所分配的合法的IP地址),来自网络10.1.1.0/24的...
iSystant一个有用的系统工具,可查看cpu,RAM,网络速度和您的实际剩余电量...网络:获取WiFi名称,IP地址,DNS,实时上下网络速度,蜂窝数据流量和WiFi流量。储存:免费储存量,已使用量电池寿命:实际剩余电池电量。
比如逻辑接口F0/0.1就分配IP地址192.168.1.1/25,用于销售部,而F0/0.2就分配IP地址192.168.1.129/25,用于企划部。这样就等于用一个物理端口确实现了两个逻辑接口的功能,这样就将原本只能划分一个网段的情形,...
6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...