转载自: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. singleTask TaskAffinity allowTaskReparenting

    关于singleTask TaskAffinity allowTaskReparenting 一.Activity的LaunchMode 1.standard 2.singleTop:FLAG_ACT ...

  2. UITableView-FDTemplateLayoutCell自动计算UITableView高度的使用

    基本应用如果你有self-satisfied cell,那么你应该做的是:#import "UITableView+FDTemplateLayoutCell.h"- (CGFloa ...

  3. JTree用法及JTree使用经验总结

    import  java.awt.Dimension; import  java.awt.Color; import  javax.swing.JFrame; import  javax.swing. ...

  4. c#结构体和字节数组的转换、字节数组和stream的转换

    本文由博主(YinaPan)原创,转载请注明出处:http://www.cnblogs.com/YinaPan/p/streambytsstruct.html using System; using ...

  5. 动态加载下拉框列表并添加onclick事件

    1.  js动态加载元素并设置属性 摘自(http://www.liangshunet.com/ca/201408/336848696.htm) <div id="parent&quo ...

  6. python密码处理(可用于生产模式)

    import os from hashlib import sha256 from hmac import HMAC def encrypt_password(password, salt=None) ...

  7. HTTP协议学习-01

    在学习一门新知识前还是先了解一下这个知识的一点点背景吧! http是属于协议层当中的最顶层的应用层,的面向对象的协议:它于 1990 年提出, 经过几年的使用与发展, 得到不断地完善和扩展. 目前在 ...

  8. C语言基础学习运算符-关系运算符

    比较大小 首先,我们得先了解一下布尔类型.C语言的C99标准支持布尔类型,关键字为_Bool,用于表示逻辑值true与false.C语言用值1表示true, 用值0表示false.因此布尔类型实际上是 ...

  9. 2014 青年歌手大赛 AC

    青年歌手大奖赛_评委会打分 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  10. 仿微博——MJExtension之字典转模型

    1.模型类中定义好属性 2.用AFN请求下来的数据保存到字典中 3.从字典中取出微博字典数组 //微博字典数组 NSArray *restrictArray = responseObject[@&qu ...