获得手机的ip

本文转载至 http://blog.csdn.net/showhilllee/article/details/8746114

iosip手机

貌似ASI里获取ip地址的链接不可以了。也曾试过whatismyip,在其网站上的截图获取的ip是正确的,单不知道为什么在我这里却是错误的。所以,在这里分享一下获得手机ip的方法。代码最初源自老外,通过系统提供的api获取的,这里我就直接贴代码了:

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

[java] view plaincopyprint?

  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 plaincopyprint?

  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 plaincopyprint?

  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 plaincopyprint?

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

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

[java] view plaincopyprint?

  1. NSString* myip = [self deviceIPAdress];

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

手机截图

程序打印截图

时间: 2024-11-18 16:51:53

获得手机的ip的相关文章

获取手机的ip地址

转载自:http://blog.csdn.net/showhilllee/article/details/8746114 貌似ASI里获取ip地址的链接不可以了.也曾试过whatismyip,在其网站上的截图获取的ip是正确的,单不知道为什么在我这里却是错误的.所以,在这里分享一下获得手机ip的方法.代码最初源自老外,通过系统提供的api获取的,这里我就直接贴代码了: 在创建的获得ip类的头文件里: [java] view plaincopyprint? #define MAXADDRS    

手机隐藏ip地址的方法简单设置

手机隐藏ip地址的方法简单设置 原文地址:http://blog.51cto.com/14019402/2313001

手机换IP的方法-PPTP

PPTP可用于手机端和电脑端,是一种协议,直接修改电脑和手机上的协议,不需要安装软件,能屏蔽掉本地IP,PPTP分为单地区和混拨.单地区就是指单个地区的IP,混拨指多个地区的IP,比如全国的IP,一个省的IP.安卓手机使用华科PPTP账号的教程,不同的手机打开方式有点不一样,具体以手机为准哦!第一 第二 第三 第四 PPP加密(MPPE)取消勾选,华科默认取消了加密,最大化利用带宽,已保证速度更好 第五 填写PPTP用户名和密码 第六 点击设置好的账号进行 连接 QQ 52693511 原文地址

检测Android手机的IP地址

package com.jason.demo.androidip; import android.content.Context; import android.net.DhcpInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.text.format.Formatter; public class IPAddress { public String getIPAd

获取手机浏览器IP的函数

function GetIP() { if (!empty($_SERVER['HTTP_CLIENT_IP'])) { //如果变量是非空或非零的值,则 empty()返回 FALSE. $IP = explode(',',$_SERVER['HTTP_CLIENT_IP']); } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $IP = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']); }

获取手机本地IP地址

public String getLocalIpAddress() { try { for (Enumeration<NetworkInterface> en = NetworkInterface .getNetworkInterfaces(); en.hasMoreElements(); ) { NetworkInterface intf = en.nextElement(); for (Enumeration<InetAddress> enumIpAddr = intf .ge

获取手机 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(&

IOS中如何获取手机的当前IP

网上有许多类似的帖子.在搜索了资料以后.觉得下面的方法是最简单的. 使用的时候直接把类方法拖到自己新建的分类中就行. .h文件 #import <Foundation/Foundation.h> @interface NSObject (GetIP) + (NSString *)deviceIPAdress; @end .m文件 #import "NSObject+GetIP.h" #include <ifaddrs.h> #include <arpa/i

[Android]手机与电脑通过adb进行连接

1:打开电脑的命令行 cmd 2:adb devices 查看与电脑连接的手机或模拟器的名称 3:准备要安装的apk.记住手机的名称 4:adb –s <模拟器名称> install  <应用程序(加扩展名)> 安装应用到指定模拟器 ---------------------------------------------------------------------------------- 1)手机与电脑处于同一个局域网内 2)获取手机的IP 3)点击电脑左下角的图标,在输入