获得手机的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 ...
随机推荐
- html5手机返回按钮跳转到指定页面问题
最近在做活动的时候有一个这样的场景,在主页面点击跳出一个弹层表单,填写完信息后,点击确认跳转到指定的展示页面了.这时候在手机端点击浏览器自带的返回按钮后,回到主页面,这时候主页面无法刷新,弹层信息还在 ...
- jemalloc原理分析
netty4引入了内存池的概念,它的主要思想源自于jemalloc,由于难以理解netty中这一块的代码,我决定先看一看网上的相关文章 官方git jemalloc原理分析 jemalloc和内存管理 ...
- nfc是什么?nfc功能是什么?
http://android.tgbus.com/lab/software/201208/447420.shtml nfc是什么?nfc功能是什么?出现在我们手机上的nfc功能怎么用?下面请看今天小编 ...
- Git Base 操作(二)
1. 撤销修改 (1) 当改乱了工作区(working directory)某个文件的内容,想直接丢弃工作区中的修改时,用命令git checkout -- file. (2) 当不但改乱了工作区某个 ...
- rpm安装与卸载命令
linux删除目录(文件夹):rmdir 目录名(目录需非空):直接删除可用: rm -rf 目录名 ,不需考虑是否为空 SecureCRT上传文件:rz ,下载文件:sz rpm 安装:rpm - ...
- CS Academy Round #65 Count Arrays (DP)
题目链接 Count Arrays 题意 给定$n$和$m$个区间.若一个长度为$n$的$01$序列满足对于每一个给定的区间中至少有一个位置是$0$, 那么这个$01$序列满足条件.求有多少满足条 ...
- mysql控制台入门级--简单的创建表,字段。。。(用于网站测试)
一:在Mysql控制台创建数据表 [sql] use ceshi; create table student ( stuid int primary key auto_incremen ...
- Kali Linux信息收集工具全
可能大部分渗透测试者都想成为网络空间的007,而我个人的目标却是成为Q先生! 看过007系列电影的朋友,应该都还记得那个戏份不多但一直都在的Q先生(由于年级太长目前已经退休).他为007发明了众多神奇 ...
- 2016.12.5 在Eclipse中为实现类impl自动生成对应接口
参考来自:http://jingyan.baidu.com/article/ab69b270d63f572ca6189f51.html 在Spring应用中,常常会用到“接口+实现类”的形式,即要实现 ...
- linux 下 ifcfg-eth0 配置 以及ifconfig、ifup、ifdown区别
这3个命令的用途都是启动网络接口,不过,ifup与ifdown仅就 /etc/sysconfig/network- scripts内的ifcfg-ethx(x为数字)进行启动或关闭的操作,并不能直接修 ...