拿到手机ip住址

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

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

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

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

[java] view
plain
copyprint?

  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();

实现文件中:

先导入文件

[java] view
plain
copyprint?

  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>

详细实现的代码

[java] view
plain
copyprint?

  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. }

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

[java] view
plain
copyprint?

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

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

[java] view
plain
copyprint" style="color:rgb(160,160,160); text-decoration:none; background-color:inherit; border:none; padding:0px; margin:0px 10px 0px 0px; font-size:9px">?

  1. NSString* myip = [self deviceIPAdress];

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

手机截图

程序打印截图

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

时间: 2024-11-10 00:07:10

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

IOS 获取手机ip地址

#include <ifaddrs.h> #include <arpa/inet.h> - (NSString *)getIPAddress {          NSString *address = @"error";     struct ifaddrs *interfaces = NULL;     struct ifaddrs *temp_addr = NULL;     int success = 0;          // retrieve th

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

页面地址:http://www.ip138.com/ 外链地址(实际主页面里面有)http://www.ip138.com/iplink.htm 外链地址里面的内容: <FORM METHOD=get ACTION="http://www.ip138.com/ips1388.asp" name="ipform" target="_blank"><tr><td align="center">I

获取手机 IP

/** *  获取用户ip * *  @return 获取用户ip */ + (NSString *)getIPAddress { NSString *address = @"an error occurred when obtaining ip address"; struct ifaddrs *interfaces = NULL; struct ifaddrs *temp_addr = NULL; int success = 0; success = getifaddrs(&

动态IP转换器_怎么修改电脑/手机IP地址

提到IP大家都应该知道,IP显示是一个你所在地的一个代码,凡是有带网络的产品设备都会有一个独立的IP显示地址.如果你是连接的WIFI此时你的IP就是你连接的网络的IP. 你是使用的手机网络就是你手机网络的IP地址.有的人想自己在手机或者电脑上设置成一个别的城市的IP地址应该怎么解决呢.其实一般手机是动态IP地址的,也就是你手机上的IP地址是可以自己切换的,但是不能换IP显示的城市,IP变动也是不大的,现在可以利用一个IP转换器的工具来使用的,可以全国性的修改IP地址,也就是隐藏自己IP最好的方法

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

首先,需要加入一个命名空间 using System.Net.NetworkInformation; using System.Net.Sockets; 以下是具体代码 GetPrivateIP(); string publicIP = GetPublicIP(); Console.WriteLine("Public IP is: {0}", publicIP); //获取公共网络IP地址 static string GetPublicIP() { String address = &

iOS 获取手机ip 《转/复制粘贴》

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #import <ifaddrs.h> #import <arpa/inet.h> // Get IP Address - (NSString *)getIPAddress {         NSString *address = @"error";     struct ifaddrs *interfaces = N

iOS 获取手机IP

引入头文件 #include <ifaddrs.h> #include <arpa/inet.h> - (NSString *)getIPAddress {        NSString *address = @"error";    struct ifaddrs *interfaces = NULL;    struct ifaddrs *temp_addr = NULL;    int success = 0;    success = getifaddr

【小功能2】android获取手机信息(号码,内存,CPU,分辨率,MAC,IP,SD卡,IMEI,经纬度,信号强度等等)

为了实现一个功能,需要搜集手机信息,自己先在网上找了相关信息进行了汇总,主要是汇集手机的信息,一般想要的信息在手机设置->关于手机->状态消息里面包含了手机的各种信息,下面的代码中也主要显示了那些信息,但是源码的方法我还没有看,先把总结的贴出来.先上图(太多就截取几个).  上代码啦,太多了,就写主要代码了. // 获取Android手机中SD卡存储信息 获取剩余空间 public void getSDCardInfo() { // 在manifest.xml文件中要添加 /* * <u

获取手机IMEI 号和 IP

没什么可说的,直接上代码: 1 public class PhoneStateCodeUtils { 2 /** 3 * 获取手机imei串号 4 */ 5 public static String getImei(Context context) { 6 TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 7 //设备串号 8 String imei = tm