本文转载至 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. C#图解教程学习笔记——事件

    一.事件的定义事件:当一个特定的程序事件发生时,程序的其他部分可以得到该事件已经发生的通知,同时运行相应处理程序.事件的很多部分都与委托类似.实际上,事件就像专门用于特殊用途的简单委托.事件包含了一个 ...

  2. hdu 2685(数论相关定理+欧几里德定理+快速取模)

    I won't tell you this is about number theory Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: ...

  3. interview ms1 robert move **

    move 2turn rightmove 3turn rightmove 6 初始位置为(0,0),方向为north,求最后的位置. string2char:  const char* t = sec ...

  4. IIS 发布双证书

    1.端口都用443 2.配置主机名 3.勾选需要服务器名称指示

  5. Dialog和软键盘在屏幕上的并存问题:

    最近做添加门店,门店昵称自动根据文字变化去搜索后台数据,但是一搜索软键盘就关闭了,感觉用户体验不太好.一开始根本不知道啥问题,找了半天才发现是网络请求dialog加载导致软件盘隐藏的,后面直接把dia ...

  6. (转)堆heap和栈stack

    一 英文名称 堆和栈是C/C++编程中经常遇到的两个基本概念.先看一下它们的英文表示: 堆――heap 栈――stack 二 从数据结构和系统两个层次理解 在具体的C/C++编程框架中,这两个概念并不 ...

  7. (6)centos安装和解压

    一.rpm包安装方式步骤:1.找到相应的软件包,比如soft.version.rpm,下载到本机某个目录:2.打开一个终端,su -成root用户:3.cd soft.version.rpm所在的目录 ...

  8. POJ 1239 Increasing Sequences [DP]

    题意:略. 思路:进行两次dp. 第一次dp从前向后,用dp[x]表示从第x位向前dp[x]位可构成一个数字,且与前面的数组符合题意要求.最后求的dp[n]即为最后一个数字的长度. 而题目还有要求,所 ...

  9. NOIP2016模拟赛三 Problem B: 神奇的树

    题面 Description 有一棵神奇的树.这棵树有N个节点,在每个节点上都有宝藏,每个宝藏价值V[i]金币:对于每条边,每经过一次都要花费C[i]金币. 值得注意的是,每个宝藏只能领取一次(也可以 ...

  10. pt-online-schema-change原理解析(转)

    pt-online-schema-change原理解析 博客相关需要阅读 - zengkefu - 博客园 .pt-online-schema-change工具的使用限制: ).如果修改表有外键,除非 ...