本文转载至 http://blog.csdn.net/showhilllee/article/details/8746114 
 
 

貌似ASI里获取ip地址的链接不可以了。也曾试过whatismyip,在其网站上的截图获取的ip是正确的,单不知道为什么在我这里却是错误的。所以,在这里分享一下获得手机ip的方法。代码最初源自老外,通过系统提供的api获取的,这里我就直接贴代码了:

在创建的获得ip类的头文件里:

  1. #define MAXADDRS    32
  2. extern char *if_names[MAXADDRS];
  3. extern char *ip_names[MAXADDRS];
  4. extern char *hw_addrs[MAXADDRS];
  5. extern unsigned long ip_addrs[MAXADDRS];
  6. // Function prototypes
  7. void InitAddresses();
  8. void FreeAddresses();
  9. void GetIPAddresses();
  10. void GetHWAddresses();

实现文件里:

先导入文件

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/ioctl.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <netdb.h>
  10. #include <arpa/inet.h>
  11. #include <sys/sockio.h>
  12. #include <net/if.h>
  13. #include <errno.h>
  14. #include <net/if_dl.h>

具体实现的代码

  1. #define    min(a,b)    ((a) < (b) ? (a) : (b))
  2. #define    max(a,b)    ((a) > (b) ? (a) : (b))
  3. #define BUFFERSIZE    4000
  4. char *if_names[MAXADDRS];
  5. char *ip_names[MAXADDRS];
  6. char *hw_addrs[MAXADDRS];
  7. unsigned long ip_addrs[MAXADDRS];
  8. static int   nextAddr = 0;
  9. void InitAddresses()
  10. {
  11. int i;
  12. for (i=0; i<MAXADDRS; ++i)
  13. {
  14. if_names[i] = ip_names[i] = hw_addrs[i] = NULL;
  15. ip_addrs[i] = 0;
  16. }
  17. }
  18. void FreeAddresses()
  19. {
  20. int i;
  21. for (i=0; i<MAXADDRS; ++i)
  22. {
  23. if (if_names[i] != 0) free(if_names[i]);
  24. if (ip_names[i] != 0) free(ip_names[i]);
  25. if (hw_addrs[i] != 0) free(hw_addrs[i]);
  26. ip_addrs[i] = 0;
  27. }
  28. InitAddresses();
  29. }
  30. void GetIPAddresses()
  31. {
  32. int                 i, len, flags;
  33. char                buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr;
  34. struct ifconf       ifc;
  35. struct ifreq        *ifr, ifrcopy;
  36. struct sockaddr_in    *sin;
  37. char temp[80];
  38. int sockfd;
  39. for (i=0; i<MAXADDRS; ++i)
  40. {
  41. if_names[i] = ip_names[i] = NULL;
  42. ip_addrs[i] = 0;
  43. }
  44. sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  45. if (sockfd < 0)
  46. {
  47. perror("socket failed");
  48. return;
  49. }
  50. ifc.ifc_len = BUFFERSIZE;
  51. ifc.ifc_buf = buffer;
  52. if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0)
  53. {
  54. perror("ioctl error");
  55. return;
  56. }
  57. lastname[0] = 0;
  58. for (ptr = buffer; ptr < buffer + ifc.ifc_len; )
  59. {
  60. ifr = (struct ifreq *)ptr;
  61. len = max(sizeof(struct sockaddr), ifr->ifr_addr.sa_len);
  62. ptr += sizeof(ifr->ifr_name) + len;    // for next one in buffer
  63. if (ifr->ifr_addr.sa_family != AF_INET)
  64. {
  65. continue;    // ignore if not desired address family
  66. }
  67. if ((cptr = (char *)strchr(ifr->ifr_name, ':')) != NULL)
  68. {
  69. *cptr = 0;        // replace colon will null
  70. }
  71. if (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == 0)
  72. {
  73. continue;    /* already processed this interface */
  74. }
  75. memcpy(lastname, ifr->ifr_name, IFNAMSIZ);
  76. ifrcopy = *ifr;
  77. ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy);
  78. flags = ifrcopy.ifr_flags;
  79. if ((flags & IFF_UP) == 0)
  80. {
  81. continue;    // ignore if interface not up
  82. }
  83. if_names[nextAddr] = (char *)malloc(strlen(ifr->ifr_name)+1);
  84. if (if_names[nextAddr] == NULL)
  85. {
  86. return;
  87. }
  88. strcpy(if_names[nextAddr], ifr->ifr_name);
  89. sin = (struct sockaddr_in *)&ifr->ifr_addr;
  90. strcpy(temp, inet_ntoa(sin->sin_addr));
  91. ip_names[nextAddr] = (char *)malloc(strlen(temp)+1);
  92. if (ip_names[nextAddr] == NULL)
  93. {
  94. return;
  95. }
  96. strcpy(ip_names[nextAddr], temp);
  97. ip_addrs[nextAddr] = sin->sin_addr.s_addr;
  98. ++nextAddr;
  99. }
  100. close(sockfd);
  101. }
  102. void GetHWAddresses()
  103. {
  104. struct ifconf ifc;
  105. struct ifreq *ifr;
  106. int i, sockfd;
  107. char buffer[BUFFERSIZE], *cp, *cplim;
  108. char temp[80];
  109. for (i=0; i<MAXADDRS; ++i)
  110. {
  111. hw_addrs[i] = NULL;
  112. }
  113. sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  114. if (sockfd < 0)
  115. {
  116. perror("socket failed");
  117. return;
  118. }
  119. ifc.ifc_len = BUFFERSIZE;
  120. ifc.ifc_buf = buffer;
  121. if (ioctl(sockfd, SIOCGIFCONF, (char *)&ifc) < 0)
  122. {
  123. perror("ioctl error");
  124. close(sockfd);
  125. return;
  126. }
  127. ifr = ifc.ifc_req;
  128. cplim = buffer + ifc.ifc_len;
  129. for (cp=buffer; cp < cplim; )
  130. {
  131. ifr = (struct ifreq *)cp;
  132. if (ifr->ifr_addr.sa_family == AF_LINK)
  133. {
  134. struct sockaddr_dl *sdl = (struct sockaddr_dl *)&ifr->ifr_addr;
  135. int a,b,c,d,e,f;
  136. int i;
  137. strcpy(temp, (char *)ether_ntoa(LLADDR(sdl)));
  138. sscanf(temp, "%x:%x:%x:%x:%x:%x", &a, &b, &c, &d, &e, &f);
  139. sprintf(temp, "%02X:%02X:%02X:%02X:%02X:%02X",a,b,c,d,e,f);
  140. for (i=0; i<MAXADDRS; ++i)
  141. {
  142. if ((if_names[i] != NULL) && (strcmp(ifr->ifr_name,if_names[i]) == 0))
  143. {
  144. if (hw_addrs[i] == NULL)
  145. {
  146. hw_addrs[i] = (char *)malloc(strlen(temp)+1);
  147. strcpy(hw_addrs[i], temp);
  148. break;
  149. }
  150. }
  151. }
  152. }
  153. cp += sizeof(ifr->ifr_name) + max(sizeof(ifr->ifr_addr), ifr->ifr_addr.sa_len);
  154. }
  155. close(sockfd);
  156. }

然后就是调用了,首先在我们的类里面导入上面那个类,之后在实现文件里写函数

  1. - (NSString *)deviceIPAdress {
  2. InitAddresses();
  3. GetIPAddresses();
  4. GetHWAddresses();
  5. return [NSString stringWithFormat:@"%s", ip_names[1]];
  6. }

然后在我们需要获得ip的地方写上

  1. NSString* myip = [self deviceIPAdress];

这里的myip就是我们需要的ip地址了

手机截图

程序打印截图

获得手机的ip的更多相关文章

  1. vue配置手机通过IP访问电脑开发环境

    vue配置手机通过IP访问电脑开发环境config/index.js// Various Dev Server settings host: '0.0.0.0', // can be overwrit ...

  2. vue配置手机通过IP访问,Win10让局域网内其他电脑通过IP访问网站的方法

    vue配置手机通过IP访问config/index.js// Various Dev Server settings host: '0.0.0.0', // can be overwritten by ...

  3. 获取手机浏览器IP的函数

    function GetIP() { if (!empty($_SERVER['HTTP_CLIENT_IP'])) { //如果变量是非空或非零的值,则 empty()返回 FALSE. $IP = ...

  4. android开发工具类之获得WIFI IP地址或者手机网络IP

    有的时候我们需要获得WIFI的IP地址获得手机网络的IP地址,这是一个工具类,专门解决这个问题,这里需要两个权限: <uses-permission android:name="and ...

  5. VUE-CLI项目同一局域网手机通过IP访问电脑本地项目

    0.找到config文件夹下的index.js文件,修改host内容为hots:'0.0.0.0',此时重新运行项目,则其他设备可以通过ip进行访问 1.首先确保电脑防火墙或者杀毒软件关闭,因为大多数 ...

  6. 利用adb查看手机设备ip和连接手机的两种方式

    电脑安装adb(查看菜鸟adb教程) [cmd]->输入adb devices (设置了path,否则需要 ./路径/adb devices)如图: 查看ip两种方法(可能有更多,目前我还没看到 ...

  7. ios 获取手机的IP地址

    - (NSString *)getIPAddress:(BOOL)preferIPv4{ NSArray *searchArray = preferIPv4 ? @[ IOS_VPN @"/ ...

  8. 检测Android手机的IP地址

    package com.jason.demo.androidip; import android.content.Context; import android.net.DhcpInfo; impor ...

  9. 安卓手机获取IP地址

    public class IpGetUtil { public static String getIPAddress(Context context) { NetworkInfo info = ((C ...

随机推荐

  1. Windows下Mysql数据库服务的关闭和重启

    有时我们在手动修改了Mysql的配置文件之后,我们要重启Mysql服务才能使之生效,这里提供几种重启方法: 1.windows下重新启动mysql5的方法:在安装mysql时系统会添加服务,可以通过管 ...

  2. Linux shell 环境变量及有效范围

    每当我们使用ssh客户端远程登陆一个服务时,操作系统就会给我们分配一个新的shell,并且这个shell继承了操作系统的永久环境变量.在当前的shell执行一个sh文件,都会临时产生一个子shell, ...

  3. 分布式定时任务调度系统技术解决方案(xxl-job、Elastic-job、Saturn)

    1.业务场景 保险人管系统每月工资结算,平安有150万代理人,如何快速的进行工资结算(数据运算型) 保险短信开门红/电商双十一 1000w+短信发送(短时汇聚型) 工作中业务场景非常多,所涉及到的场景 ...

  4. querySelector和getElementById之间的区别

    一.概述 今天在看js的时候发现里面的代码基本上都是用querySelector()和querySelectorAll()来获取元素,就有点疑惑为什么不用getElementById(),可能也是因为 ...

  5. 洛谷——P3183 [HAOI2016]食物链

    P3183 [HAOI2016]食物链 题目描述 如图所示为某生态系统的食物网示意图,据图回答第1小题现在给你n个物种和m条能量流动关系,求其中的食物链条数.物种的名称为从1到n编号M条能量流动关系形 ...

  6. 利用Jdk 6260652 Bug解析Arrays.asList

    在java.util.ArrayList源码中: c.toArray might (incorrectly) not return Object[] (see 6260652) 产生疑惑: 附上Jav ...

  7. HNOI 2006 BZOJ 1195 最短母串

    题面 问题描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. 输入 第一行是一个正整数n(n<=12),表示给定的字 ...

  8. 使用nginx实现的灰度发布思路研究(待实践)

    灰度发布也叫 A/B 测试,原理是一套系统在实现了负载均衡,全国节点都部署了系统之后,可以在新功能上线后,让一小部分用户先使用,从中收集使用信息来做对比和发现bug,及时调整,最终分发到全国的节点. ...

  9. 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 ...

  10. ZT:成熟是一种明亮而不刺眼的光辉

    成熟是一种明亮而不刺眼的光辉, 一种圆润而不腻耳的音响, 一种不再需要对别人察言观色的, 一种终于停止向周围申诉求告的大气, 一种不理会哄闹的微笑, 一种洗刷了偏激的冷漠, 一种无需声张的厚实, 一种 ...