获取iPhone本机IP地址新方法
最近在项目中要获取iphone手机本机的ip地址。在我一博客中也写到方法了。但是那种方法只适合于非3G网络。今天网上找了下一个不同以前的获取方式。特记录下。先感谢作者。 转至 http://mobile.51cto.com/iphone-282795.htm
获取iPhone本机IP地址并且不需调用私有API方法是本文要介绍的内容,主要是手头一个iphone项目需要取iphone本机ip地址,在iphone os 2.0上可以用下面的方法获得。内容不多,主要是代码实现IP地址的获取。
- -(NSString*)getAddress {
- char iphone_ip[255];
- strcpy(iphone_ip,"127.0.0.1"); // if everything fails
- NSHost* myhost = [NSHost currentHost];
- if (myhost)
- {
- NSString *ad = [myhost address];
- if (ad)
- strcpy(iphone_ip,[ad cStringUsingEncoding:NSISOLatin1StringEncoding]);
- }
- return [NSString stringWithFormat:@"%s",iphone_ip];
- }
- 到3.0这个方法成了苹果私有api了,用了不对不说,error:
- warning: no ‘+currentHost’ method found
- warning: (Messages without a matching method signature)
- ,提交的app还被reject:
- [NSHost currentHost] will also work, but it is deprecated and considered a “Private API” by Apple,
- so you won’t be able to submit your application to App Store.
- google很久无果;今天无意发现一个老外的blog贴了方法,试用了下完全OK,要翻墙看,转载记录一下.
- As far as I know there is only one hacky way to do that. You basically open a socket and get its address using POSIX functions.
- Here is the code I used for this:
- /*
- * IPAdress.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];
- // Function prototypes
- 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; // 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);
- }
- test:
- #import "IPAdress.h"
- - (NSString *)deviceIPAdress {
- InitAddresses();
- GetIPAddresses();
- GetHWAddresses();
- return [NSString stringWithFormat:@"%s", ip_names[1]];
- }
- - (void)viewDidLoad {
- [super viewDidLoad];
- NSString* ip_iphone = [self deviceIPAdress];
- NSLog(@"ip:%@",ip_iphone);
- }
获取iPhone本机IP地址新方法相关推荐
- 获取本机IP地址的方法
文章目录 获取本机IP地址的方法总结 一.Windows电脑 获取本机 IP 地址 1.命令行获取 2.使用网络状态查看IP地址 二.Mac 电脑获取本机 IP 地址 1. mac电脑要输入**ifc ...
- vc获取计算机用户名,vc获取计算机名和ip地址的方法
vc获取计算机名和ip地址的方法 本文实例讲述了vc获取计算机名和ip地址的方法.分享给大家供大家参考.具体实现方法如下: #include #include #pragma comment(lib, ...
- Win11IP地址在哪里看?Win11查看本机IP地址的方法
Win11IP地址在哪里看?每一台可以联网的电脑都拥有一个IP地址,如果说电脑就是一部电话,那么IP地址,我们可以把它当作为我们的电话号码.今天将为大家分享Win11查看本机IP地址的方法. 方法一: ...
- Unity中获取本机IP地址的方法
做OptiTrack局域网数据通信时,需要设置本地IP和动捕数据服务器IP,来实现获取动捕数据.由于局域网搭建时需要手动设置电脑IP,因此想到如果可以获取本机IP,服务器IP通常设置固定后不会更改,如 ...
- java获取请求本机ip地址
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...
- java获取服务器ip地址_java中获取当前服务器的Ip地址的方法
1.tomcat是一款免费的开源Web服务器,如果部署在本地,那么对应的那么为localhost,对应地址为127.0.0.1. 例子:可以通过http://localhost:8080/项目root ...
- 获取本机所有IP地址的方法
获取本机所有IP地址的方法 java.net包中的IP地址类InetAddress提供了可以获取本机IP地址的方法getLocalHost(),但是通过该方法只能获得第一个网络设备的IP地址.但 ...
- 快速获取本机IP地址AWK功能
有些时候,我们在应用中可能要用到通过linux命令来获取本机IP地址,方法有很多种,例如最常见的就是ifconfig 如果我想尽尽只获取IP地址,方法也有很多种 例如:获取eth0的IP信息,利用cu ...
- 用java获取本机IP地址
在网上找了几个用java获取本机IP地址的代码,发现都少都有些不完美,自己整理了一下.突然之间很想把自己的IP地址给获取了,虽然用系统自带命令可以得到,但自己想写一个程序获取一下,到网上搜索了一下ja ...
最新文章
- RUP within the context of the Six Best Practices
- ubuntu18.04搭建SLAM环境 转 高翔 十四讲匹配环境
- python类继承实例
- 【温故知新】CSS学习笔记(外边距合并)
- python函数中把列表(list)当参数时的入坑与出坑
- 视频检索扫盲 (一)
- why jQuery.clone does not work as expected
- 带你自学Python系列(九):一文读懂Python中字典应用原理!
- LeetCode-94. 二叉树的中序遍历
- Ubuntu 14.04开启ssh服务
- 韩顺平 php大牛班课程,2016 泰牛程序员 韩顺平 PHP 大牛班 javascript课程 完整笔记.doc...
- 白化滤波器 matlab,白化滤波器-matlab-程序.doc
- 2016小米-风口的猪-中国牛市-Java
- 日志报错:WARNING: An illegal reflective access operation has occurred
- 投影仿真1.0-二维图像矩阵投影
- Android(permission)常用权限
- Windows驱动开发WDM (13)- 过滤驱动
- Finereport 9.0升级到10.0工具下载[9-10升级工具]
- Android WIFI调试助手2.0使用指南
- 硬石YS-F1Pro开发板HAL库例程持续更新\2. 软件设计之高级裸机例程(HAL库版本)\YSF1_HAL-121. MH-Z14A二氧化碳传感器模块