转载自: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. 31.Spring-开发流程.md

    [toc] 1.简单开发流程 1.1引用类库 基本类库: ## 1.2创建spring配置文件,文件的名称为固定格式:applicationContext.xml或者bean.xml: <?xm ...

  2. jquery mobile listview列表属性(搜索自动填充检索效果)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  3. Json处理函数json_encode json_decode

    json_decode — 对 JSON 格式的字符串进行编码 mixed json_decode ( string $json [, bool $assoc = false [, int $dept ...

  4. Python环境配置及项目建立

    一.安装Python Python比较稳定的两个版本是Python 3.5和Python 2.7,我用的是Python 2.7,下载地址是:https://www.python.org/downloa ...

  5. MLlib-聚类

    聚类 例子 流聚类 例子 聚类 MLlib支持k-means聚类,一种最常用的聚类方法,将数据点聚成指定数据的簇.MLlib实现了一种k-means++的并行变种,叫做kmeansII.MLlib的实 ...

  6. listen函数

    listen函数仅仅由TCP服务器调用,它做2件事: 1)当socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,它是一个将调用connect发起连接的客户套接字 listen函数把一 ...

  7. 怎样在Swift中使用CocoaPods-b

    最近关于CocoaPods有很多的议论.你可能从别的开发者那里听到过,或者在Github的目录中看到过.如果你之前从来没有用过,你可能会问,"CocoaPods到底是什么?" 它不 ...

  8. 新的疑问(未解决):VC项目的配置,不是都能在Project -- Properties里设置解决的

    现象:死活解决不了引入外部库的LPCWSTR参数传递问题.而用VS新建的项目,就没有这个问题. 我怀疑是当初.pro文件产生VC项目文件时候,做了一些设置,但是内容太长了,又很复杂,所以没法核对. 用 ...

  9. 关于windows service不能访问网络共享盘(NetWork Drive)的解决方案

    我映射一个网络驱动器到本机的时候,发现本机的程序直接能访问读取网络驱动器,但是把本机的程序作为本机的windows服务运行的时候就不能访问了. Qt中的QDir::exist(folder)访问失败. ...

  10. !!!全球最流行开源硬件平台!不知道就OUT了!

    全球最流行的几个开源硬件平台!不知道就OUT了! 随着物联网的推广和普及,五年内全球会有200亿台智能设备的需求,而如今随着创客概念的兴起,开源硬件也越加的火热,让我们来看看现在都有哪些主流的开源硬件 ...