tcp/ip协议中,专门保留了三个IP地址区域作为私有地址,其地址范围如下:

10.0.0.0/8:10.0.0.0~10.255.255.255
  172.16.0.0/12:172.16.0.0~172.31.255.255
  192.168.0.0/16:192.168.0.0~192.168.255.255
使用保留地址的网络只能在内部进行通信,而不能与其他网络互连。如果要与外部通信,那么必须通过网关与外部通信,这里使用了NAT, NAPT技术就是用来保证通信的代理机制。
 
       另外,一些宽带运营商尽管也使用了非私有地址分配给用户使用,但是由于路由设置的原因,Internet上的其他用户并不能访问到这些ip。上面2部分IP都可称为内网IP,下面这部分IP不列入本次讨论范围。
 
如果自己机器上网络接口的ip地址落在上述保留地址的范围内,则可以肯定自己处于内网模式下。
NAT要求整个服务的连接是从内网向外网主动发起的,而外网的用户无法直接(主动)向内网的服务发起连接请求,除非在NAT的(所有)网关上针对服务的端口作了端口映射。NAT方式要求最外围的网关至少有一个公网的IP,可以访问显IP的外部服务器如:http://ipid.shat.net/ 获取到外部IP,将这个IP与自己机器上网络接口的ip比较,即可知道自己的ip是不是内网IP。
 
判断自己IP类型,可使用下面三种任意一种方法:
1)      在windos命令台程序下,用ipconfig。
Eg: 下面内网IP是192.168.0.1,外网IP是125.34.47.25,因此是网关。
C:/Documents and Settings/user>ipconfig
 
Windows IP Configuration
Ethernet adapter 本地连接:
        Connection-specific DNS Suffix . :
        IP Address. . . . . . . . . . . . : 192.168.0.1
        Subnet Mask . . . . . . . . . . . : 255.255.255.0
        Default Gateway . . . . . . . . . : 192.168.0.1
 
Ethernet adapter {6C8AEC26-0EC3-40FE-812E-A46778ECA752}:
        Media State . . . . . . . . . . . : Media disconnected
 
PPP adapter 宽带拨号:
        Connection-specific DNS Suffix . :
        IP Address. . . . . . . . . . . . : 125.34.47.25
        Subnet Mask . . . . . . . . . . . : 255.255.255.255
        Default Gateway . . . . . . . . . : 125.34.47.25
 
2)      用tracert来判断IP类型
如果每一个hops不是内网IP,那么自己就是外网IP了,反之,如果自己是内网IP,那么每一个hops显示的就是网关的内网IP,下面的例子显然说明是外网IP了。
C:/Documents and Settings/user>tracert www.baidu.com
 
Tracing route to www.a.shifen.com [202.108.22.5]
over a maximum of 30 hops:
 1    15 ms    16 ms    14 ms 125.34.40.1
 2   14 ms     *        *     61.148.8.9
 3    26 ms    72 ms    40 ms xd-22-5-a8.bta.net.cn [202.108.22.5]
 
Trace complete.
 
3)编程实现
获取到本机所有的IP地址列表,对IP列表进行分析:
1) 如果列表中只有局域网IP,那么说明是在内网;
2) 如果列表中有局域网IP,也有公网IP,那么说明是网关;
3) 如果列表中只有公网IP,那么说明是独立IP。
//此处不考虑其它平台,在inet架构下测试, 输入的ip为主机字节顺序
// 0xa -- "10.0.0.0">>24; 0xc0a8--"192.168.0.0.">>16; 0x2b0--"127.17.0.1">>22
int isInnerIP( uint32_t a_ip )
{
       int bValid = -1;
       if( (a_ip>>24 == 0xa) || (a_ip>>16 == 0xc0a8) || (a_ip>>22 == 0x2b0) )
       {
          bValid = 0;
       }
       return bValid;
}
int isInnerIP( char* a_strip )
{
       return 0;
}
IP相关的应用
//获取到本机所有的IP地址列表,并分别用字符串与整形形式来显示
int getHostIP()       //return int
{
       struct sockaddr_in localAddr, destAddr;
       struct hostent* h;
       char temp[128];
 
       int nRect = gethostname(temp, 128);
       printf("ipaddr src3 is: %s/n", temp);
       if(nRect !=0)
       {
              printf("error");
       }
       h = gethostbyname(temp);
       if(h)
       {
              for(int nAdapter=0; h->h_addr_list[nAdapter]; nAdapter++)
              {
                     memcpy(&destAddr.sin_addr.s_addr, h->h_addr_list[nAdapter], h->h_length);
                     // 输出机器的IP地址.
                     printf("Address string: %s/n", inet_ntoa(destAddr.sin_addr)); // 显示地址串
                     printf("Address int: %d/n", destAddr.sin_addr.s_addr); // 转化为整形数字
              }
       }
       return     0;
}
 
//检查字符串IP是否合法
int isCheckTrue(char* strip)
{
       int value;
       for( int i = 0; i < strlen(strip); i++)
       {
       // let's check if all entered char in entered
       // IP address are digits
              if(strip[i] == '.')
                     continue;
 
              if(isdigit(strip[i]) == 0)
              {
                     return -1;
              }
       }
       return 0;
}
//将字符串IP转化为整形IP
int str2intIP(char* strip) //return int ip
{
       int intIP;
       if(!(intIP = inet_addr(strip)))
       {
              perror("inet_addr failed./n");
              return -1;
       }
       return intIP;
}

ip识别运用的更多相关文章

  1. 使用Hive UDF和GeoIP库为Hive加入IP识别功能

    Hive是基于Hadoop的数据管理系统,作为分析人员的即时分析工具和ETL等工作的执行引擎,对于如今的大数据管理与分析.处理有着非常大的 意义.GeoIP是一套IP映射数据库,它定时更新,并且提供了 ...

  2. (转)使用Hive UDF和GeoIP库为Hive加入IP识别功能

    Hive是基于Hadoop的数据管理系统,作为分析人员的即时分析工具和ETL等工作的执行引擎,对于如今的大数据管理与分析.处理有着非常大的 意义.GeoIP是一套IP映射数据库,它定时更新,并且提供了 ...

  3. 根据ip识别地区

    <script src="http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js"></scri ...

  4. edge浏览器识别ip地址为手机号的解决办法

    edge浏览器识别ip地址为手机号的解决办法 今天突然发现类似101.231.70.242的ip地址会在edge浏览器里面识别为可点击的链接,后来看了一下,原因就是被识别为手机号了,因为我发现点击的时 ...

  5. RocEDU.阅读.写作《图解TCP/IP》

    2015年11月21日 一.对本书的认识 信息通信社会这个词俨然是现代社会的一个名词.人们可以使用各种信息终端随时随地的进行交流,而这种环境正是以来网络才得以实现,使用最为广泛的协议就是TCP/IP协 ...

  6. 配置vmware的固定ip

    一 .概述 为什么要配置固定IP呀?这个很容易解释啊,因为配置集群要设置固定IP(主结点需要管理子结点,通过固定IP识别机器),因为你访问虚拟机方便(不固定IP访问前还需要先查下虚拟机当前分配IP,比 ...

  7. 如果通过 IP 判断是否是爬虫

    通过 IP 判断爬虫 如果你查看服务器日志,看到密密麻麻的 IP 地址,你一眼可以看出来那些 IP 是爬虫,那些 IP 是正常的爬虫,就像这样: 在这密密麻麻的日志里面,我们不仅要分辨出真正的爬虫 I ...

  8. 如何通过 User-Agent 识别百度蜘蛛

    如果有大量的百度蜘蛛抓取网站就需要注意了:有可能是其他爬虫伪造百度蜘蛛恶意抓取网站. 如果遇到这种情况,这时候就需要查看日志来确定是不是真正的百度蜘蛛(baidu spider).搜索引擎蜘蛛.用户访 ...

  9. centos之Haproxy 负载均衡学习笔记

    HAProxy的特点是:1.支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机:2.能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作3.支持url检测后端的 ...

随机推荐

  1. Validation of viewstate MAC failed machinekey生成、使用方法

    前段时间公司为了减轻服务器压力,对网页做了集群,分布在多台服务器,通过DNS轮回解析到各台服务器,结果页面只要打开停留到DNS解析到下一个地址,就会出现出下错误信息. Validation of vi ...

  2. cin详解(cin.get()、cin.getline()、cin.clear()、cin.sync())

    在C中,输入输出用scanf和printf,在输入数据的同时还需说明数据的类型,如果输入数据较多,那就很麻烦,而C++中也有相似的东西cin和cout,它们来自C++的一个名叫" iostr ...

  3. Windows快捷键大全(从XP到win8.1)

    常见用法 F1 显示当前程序或者windows的帮助内容. F2 当你选中一个文件的话,这意味着“重命名” F3 当你在桌面上的时候是打开“查找:所有文件” 对话框 F5 刷新 F10或ALT 激活当 ...

  4. 编译使用tinyxml

    环境: win7 32位旗舰版,VS2010,tinyxml_2_6_2版本 1.下载tinyxml,并解压到tinyxml文件夹下 2.生成动态链接库 原生的Tinyxml只支持静态库(没有在.h文 ...

  5. ubuntu环境下安装Tomcat

    tomcat 是javaweb开发的本地服务器,tomcat是目前比较流行的一款. 1.下载Tomcat:http://tomcat.apache.org 2.进入下载文件夹解压Tomcat:sudo ...

  6. Android自动化测试之环境搭建

    Android自动化测试之环境搭建 一.Android-sdk介绍 SDK(Software development kit)软件开发工具包.被软件开发工程师用于为特定的软件包.软件框架.硬件平台. ...

  7. Mesos架构简介

    1. 前言 同其他大部分分布式系统一样,Apache Mesos为了简化设计,也是采用了master/slave结构,为了解决master单点故障,将master做得尽可能地轻量级,其上面所有的元数据 ...

  8. android apk jarsigner 签名打包

    cmd 命令符打包: 规则:  jarsigner -verbose -keystore 签名路径 -signedjar 签名后的apk存放路径  未签名的apk 签名文件的别名 项目如我的项目是: ...

  9. Node.js学习 - RESTFul API

    REST Representational State Transfer (表述性状态转移), 是一组架构约束条件和原则.满足这些约束条件和原则的应用程序或设计就是RESTful. RESTful W ...

  10. CentOS下编译安装Apache2(新)

    官网下载apache,apr, apr-util,pcre httpd-2.4.16.tar.gz http://httpd.apache.org/download.cgi#apache24 apr- ...