获得手机的ip
貌似ASI里获取ip地址的链接不可以了。也曾试过whatismyip,在其网站上的截图获取的ip是正确的,单不知道为什么在我这里却是错误的。所以,在这里分享一下获得手机ip的方法。代码最初源自老外,通过系统提供的api获取的,这里我就直接贴代码了:
在创建的获得ip类的头文件里:
- #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();
实现文件里:
先导入文件
- #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);
- }
然后就是调用了,首先在我们的类里面导入上面那个类,之后在实现文件里写函数
- - (NSString *)deviceIPAdress {
- InitAddresses();
- GetIPAddresses();
- GetHWAddresses();
- return [NSString stringWithFormat:@"%s", ip_names[1]];
- }
然后在我们需要获得ip的地方写上
- NSString* myip = [self deviceIPAdress];
这里的myip就是我们需要的ip地址了
手机截图
程序打印截图
获得手机的ip的更多相关文章
- vue配置手机通过IP访问电脑开发环境
vue配置手机通过IP访问电脑开发环境config/index.js// Various Dev Server settings host: '0.0.0.0', // can be overwrit ...
- vue配置手机通过IP访问,Win10让局域网内其他电脑通过IP访问网站的方法
vue配置手机通过IP访问config/index.js// Various Dev Server settings host: '0.0.0.0', // can be overwritten by ...
- 获取手机浏览器IP的函数
function GetIP() { if (!empty($_SERVER['HTTP_CLIENT_IP'])) { //如果变量是非空或非零的值,则 empty()返回 FALSE. $IP = ...
- android开发工具类之获得WIFI IP地址或者手机网络IP
有的时候我们需要获得WIFI的IP地址获得手机网络的IP地址,这是一个工具类,专门解决这个问题,这里需要两个权限: <uses-permission android:name="and ...
- VUE-CLI项目同一局域网手机通过IP访问电脑本地项目
0.找到config文件夹下的index.js文件,修改host内容为hots:'0.0.0.0',此时重新运行项目,则其他设备可以通过ip进行访问 1.首先确保电脑防火墙或者杀毒软件关闭,因为大多数 ...
- 利用adb查看手机设备ip和连接手机的两种方式
电脑安装adb(查看菜鸟adb教程) [cmd]->输入adb devices (设置了path,否则需要 ./路径/adb devices)如图: 查看ip两种方法(可能有更多,目前我还没看到 ...
- ios 获取手机的IP地址
- (NSString *)getIPAddress:(BOOL)preferIPv4{ NSArray *searchArray = preferIPv4 ? @[ IOS_VPN @"/ ...
- 检测Android手机的IP地址
package com.jason.demo.androidip; import android.content.Context; import android.net.DhcpInfo; impor ...
- 安卓手机获取IP地址
public class IpGetUtil { public static String getIPAddress(Context context) { NetworkInfo info = ((C ...
随机推荐
- Windows下Mysql数据库服务的关闭和重启
有时我们在手动修改了Mysql的配置文件之后,我们要重启Mysql服务才能使之生效,这里提供几种重启方法: 1.windows下重新启动mysql5的方法:在安装mysql时系统会添加服务,可以通过管 ...
- Linux shell 环境变量及有效范围
每当我们使用ssh客户端远程登陆一个服务时,操作系统就会给我们分配一个新的shell,并且这个shell继承了操作系统的永久环境变量.在当前的shell执行一个sh文件,都会临时产生一个子shell, ...
- 分布式定时任务调度系统技术解决方案(xxl-job、Elastic-job、Saturn)
1.业务场景 保险人管系统每月工资结算,平安有150万代理人,如何快速的进行工资结算(数据运算型) 保险短信开门红/电商双十一 1000w+短信发送(短时汇聚型) 工作中业务场景非常多,所涉及到的场景 ...
- querySelector和getElementById之间的区别
一.概述 今天在看js的时候发现里面的代码基本上都是用querySelector()和querySelectorAll()来获取元素,就有点疑惑为什么不用getElementById(),可能也是因为 ...
- 洛谷——P3183 [HAOI2016]食物链
P3183 [HAOI2016]食物链 题目描述 如图所示为某生态系统的食物网示意图,据图回答第1小题现在给你n个物种和m条能量流动关系,求其中的食物链条数.物种的名称为从1到n编号M条能量流动关系形 ...
- 利用Jdk 6260652 Bug解析Arrays.asList
在java.util.ArrayList源码中: c.toArray might (incorrectly) not return Object[] (see 6260652) 产生疑惑: 附上Jav ...
- HNOI 2006 BZOJ 1195 最短母串
题面 问题描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. 输入 第一行是一个正整数n(n<=12),表示给定的字 ...
- 使用nginx实现的灰度发布思路研究(待实践)
灰度发布也叫 A/B 测试,原理是一套系统在实现了负载均衡,全国节点都部署了系统之后,可以在新功能上线后,让一小部分用户先使用,从中收集使用信息来做对比和发现bug,及时调整,最终分发到全国的节点. ...
- 8 Most Required Examples Reference For Oracle Forms
Check the following 8 Links for best Oracle Forms examples with source code (Fmb files), which will ...
- ZT:成熟是一种明亮而不刺眼的光辉
成熟是一种明亮而不刺眼的光辉, 一种圆润而不腻耳的音响, 一种不再需要对别人察言观色的, 一种终于停止向周围申诉求告的大气, 一种不理会哄闹的微笑, 一种洗刷了偏激的冷漠, 一种无需声张的厚实, 一种 ...