转载自:http://blog.csdn.net/showhilllee/article/details/8746114

貌似ASI里获取ip地址的链接不能够了。也曾试过whatismyip,在其站点上的截图获取的ip是正确的,单不知道为什么在我这里却是错误的。所以,在这里分享一下获得手机ip的方法。

代码最初源自老外,通过系统提供的api获取的,这里我就直接贴代码了:

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

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

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

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

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

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

手机截图

程序打印截图

版权声明:本文博主原创文章。博客,未经同意不得转载。

拿到手机ip住址的更多相关文章

  1. 微信小程序开发(八)获取手机ip地址

    // succ.wxml <view>手机IP:{{motto.query}}</view> // succ.js var app = getApp() Page({ data ...

  2. (转)ip地址,手机ip查询

    页面地址:http://www.ip138.com/ 外链地址(实际主页面里面有)http://www.ip138.com/iplink.htm 外链地址里面的内容: <FORM METHOD= ...

  3. Android-------------获取手机IP地址

    ##帮助类PhoneNetStateUtil package com.funs.PhoneIPAddress.utils; /**      * 手机联网状态工具类 需要的权限 WIFI时:</ ...

  4. 获取手机 IP

    /** *  获取用户ip * *  @return 获取用户ip */ + (NSString *)getIPAddress { NSString *address = @"an erro ...

  5. 得到client真IP住址

    1.引进的必要性log4j-1.2.14.jar package org.ydd.test; import java.util.Enumeration; import javax.servlet.ht ...

  6. 13 于C#如何获得在IP住址

    首先,需要加入一个命名空间 using System.Net.NetworkInformation; using System.Net.Sockets; 以下是具体代码 GetPrivateIP(); ...

  7. Xamarin.Android 获取手机IP地址

    命名空间: using System.Net; 代码: IPAddress[] address = Dns.GetHostAddresses(Dns.GetHostName()); ] != null ...

  8. 获取手机IMEI 号和 IP

    没什么可说的,直接上代码: public class PhoneStateCodeUtils { /** * 获取手机imei串号 */ public static String getImei(Co ...

  9. 获得手机的ip

    本文转载至 http://blog.csdn.net/showhilllee/article/details/8746114      iosip手机 貌似ASI里获取ip地址的链接不可以了.也曾试过 ...

随机推荐

  1. 抓取锁的sql语句-第四次修改

    --完成情况   变量V_BLOCKING_SID 用来动态抓取 产生锁的会话id,输出参数没有任何问题,但是执行报错  标识符无效! CREATE OR REPLACE PROCEDURE SOLV ...

  2. 认识div(division)在排版中的作用

    在网页制作过程过中,可以把一些独立的逻辑部分划分出来,放在一个<div>标签中,这个<div>标签的作用就相当于一个容器. 语法: <div>…</div&g ...

  3. socket (转,吴秦,http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html)

    Linux Socket编程(不限Linux)2010-12-12 21:58 by 吴秦 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web ...

  4. log4net编译后命名空间找不到的问题

    log4net编译后命名空间找不到的问题问题:工程A添加dll引用后,可以在代码中引入log4net的命名空间.工程B引用A.A能编译成功,B不能编译成功,提示找不到命名空间. 解决: 点击项目属性- ...

  5. 第三方分页控件aspnetPager出现问题解决方法

    问题描述: 今天在打开以前的项目使用vs2013打开后并且生成解决方案的时候发现报错了.经过检查发现是由于第三方分页控件aspnetPager在页面上不能引用到了. 解决方法: 1. 首先将AspNe ...

  6. 大数据学习之测试hdfs和mapreduce(二)

    上篇已经搭建好环境,本篇主要测试hadoop中的hdfs和mapreduce功能. 首先填坑:启动环境时发现DataNode启动不了.查看日志 从日志中可以看出,原因是因为datanode的clust ...

  7. jQuery显示与隐藏返回顶层的箭头

    <script type="text/javascript">        $(window).scroll(function(){            var d ...

  8. Scut:参数导入方式(有遗留疑问)

    先上一段代码: public EnvironmentSetting() { var appServer = GetServerSection(); var protocol = GetProtocol ...

  9. Topk引发的一些简单的思考

    软件工程课程的一个题目:写一个程序,分析一个文本文件中各个词出现的频率,并且把频率最高的10个词打印出来.文本文件大约是30KB~300KB大小. 首先说一下这边的具体的实现都是在linux上实现的. ...

  10. strcmp() Anyone?

    uva11732:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_prob ...