本文转载至 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. html5手机返回按钮跳转到指定页面问题

    最近在做活动的时候有一个这样的场景,在主页面点击跳出一个弹层表单,填写完信息后,点击确认跳转到指定的展示页面了.这时候在手机端点击浏览器自带的返回按钮后,回到主页面,这时候主页面无法刷新,弹层信息还在 ...

  2. jemalloc原理分析

    netty4引入了内存池的概念,它的主要思想源自于jemalloc,由于难以理解netty中这一块的代码,我决定先看一看网上的相关文章 官方git jemalloc原理分析 jemalloc和内存管理 ...

  3. nfc是什么?nfc功能是什么?

    http://android.tgbus.com/lab/software/201208/447420.shtml nfc是什么?nfc功能是什么?出现在我们手机上的nfc功能怎么用?下面请看今天小编 ...

  4. Git Base 操作(二)

    1. 撤销修改 (1) 当改乱了工作区(working directory)某个文件的内容,想直接丢弃工作区中的修改时,用命令git checkout -- file. (2) 当不但改乱了工作区某个 ...

  5. rpm安装与卸载命令

    linux删除目录(文件夹):rmdir 目录名(目录需非空):直接删除可用: rm -rf 目录名 ,不需考虑是否为空 SecureCRT上传文件:rz  ,下载文件:sz rpm 安装:rpm - ...

  6. CS Academy Round #65 Count Arrays (DP)

    题目链接  Count Arrays 题意  给定$n$和$m$个区间.若一个长度为$n$的$01$序列满足对于每一个给定的区间中至少有一个位置是$0$, 那么这个$01$序列满足条件.求有多少满足条 ...

  7. mysql控制台入门级--简单的创建表,字段。。。(用于网站测试)

    一:在Mysql控制台创建数据表 [sql]  use ceshi;  create table student  (      stuid int primary key auto_incremen ...

  8. Kali Linux信息收集工具全

    可能大部分渗透测试者都想成为网络空间的007,而我个人的目标却是成为Q先生! 看过007系列电影的朋友,应该都还记得那个戏份不多但一直都在的Q先生(由于年级太长目前已经退休).他为007发明了众多神奇 ...

  9. 2016.12.5 在Eclipse中为实现类impl自动生成对应接口

    参考来自:http://jingyan.baidu.com/article/ab69b270d63f572ca6189f51.html 在Spring应用中,常常会用到“接口+实现类”的形式,即要实现 ...

  10. linux 下 ifcfg-eth0 配置 以及ifconfig、ifup、ifdown区别

    这3个命令的用途都是启动网络接口,不过,ifup与ifdown仅就 /etc/sysconfig/network- scripts内的ifcfg-ethx(x为数字)进行启动或关闭的操作,并不能直接修 ...