转载自: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. NSUserDefaults 很详细的介绍使用(转发)

    http://my.oschina.net/u/1245365/blog/294449

  2. Eclipse怎么忽略掉报错的js文件

    第一步,我们要先定位错误在哪里,选择菜单里window——show view——other,选择Problems. 第二步,点击有红叉的项目,在Problems视图中,可以看到是什么错,哪个文件夹中的 ...

  3. SQL中varchar和nvarchar有什么区别?

    varchar(n)长度为 n 个字节的可变长度且非 Unicode 的字符数据.n 必须是一个介于 1 和 8,000 之间的数值.存储大小为输入数据的字节的实际长度,而不是 n 个字节.nvarc ...

  4. js性能优化--学习笔记

    <高性能网站建设进阶指南>: 1.使用局部变量,避免深入作用域查找,局部变量是读写速度最快的:把函数中使用次数超过一次的对象属性和数组存储为局部变量是一个好方法:比如for循环中的.len ...

  5. Websocket 与代理服务器如何交互? How HTML5 Web Sockets Interact With Proxy Servers

    How HTML5 Web Sockets Interact With Proxy Servers Posted by Peter Lubberson Mar 16, 2010 With the re ...

  6. python模块中的特殊变量

    37.模块的特殊变量:      显示模块中的变量 import s1 print(vars(s1))      1.__doc__:打印注释信息. #!/usr/bin/env python # _ ...

  7. USB方向

    Because the host is always the bus master, it is easy to remember USB direction: OUT means from the ...

  8. Nginx 基本配置和日志分析

    最近在维护的一个项目,路由转发规则都统一通过Nginx转发,所以再次参考部分博文和书本,熟悉Nginx的基本配置,还有一个重点也是日志的分析 Nginx 常用模块是server块,location块. ...

  9. segv & mini coredump

    1. mini coredump    a. segv      http://zh.scribd.com/doc/3726406/Crash-N-Burn-Writing-Linux-applica ...

  10. IT的发展路径

    1.掌握更多的技能 2.掌握某一门深入的技能 3.掌握更多的工具 4.掌握业务