转载自: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. Oracle10g、 Oracle11g完美共存

    Oracle10g. Oracle11g完美共存           环境描述 客户服务器上已经安装Oracle9i软件并部署多套数据库,现在客户要求安装Oracle11g软件,并且创建11g数据库, ...

  2. ios 中的UI控件学习总结(1)

    UIKit框架提供了非常多功能强大又易用的UI控件 下面列举一些在开发中可能用得上的UI控件 UIButton 按钮 UILabel 文本标签 UITextField 文本输入框 UIImageVie ...

  3. oc总结

    OC10天大纲 一.类和对象 1.什么是类? 同一种对象的抽象就是类. 2.什么是对象? 世界上的任何事物都可以称为对象,每个对象都有他自己的属性和行为. 3.如何创建一个类(请把一个.h和一个.m粘 ...

  4. Java study 1:The note of studying Socket which based UDP

    UDP concept: UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参 ...

  5. equals和hashcode

    java当中所有的类都继承于Object这个基类,在object中的基类定义了一个equals方法,public boolean equals(Object obj) {     return (th ...

  6. Spring4.0学习笔记(9) —— Spring泛型依赖注入

    1.定义基础仓库 package com.spring.generic.di; public class BaseRepository<T> { } 2.定义基础服务层 package c ...

  7. 修改本地数据库root权限密码

    方法1: 用SET PASSWORD命令 测试成功 首先登录MySQL @1——mysql DOS 窗口中. 格式:mysql> set password for 用户名@localhost = ...

  8. exit() die return 的区别

    rutrun 会返回一个值,或不返回值 只是当前函数内return后面的语句将不会执行,后面的其它语句继续执行exit()可以返回值,也可以不返回值直接终止程序 函数输出一条消息,并退出当前脚本. 会 ...

  9. Memcached源码分析——process_command函数解析

    以下为个人笔记 /** * process_command 在memcached中是用来处理用户发送的命令的, * 包括get set,add,delete,replace,stats,flush_a ...

  10. iOS开发——常用Runtime函数

    Runtime函数 1.可以通过NSObject的一些方法获取运行时信息或动态执行一些消息:1./*Returns a Boolean value that indicates whether the ...