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. cocos2d-lua SDK接入

    1.lua 调用Java函数 1.1 在java中创建一个静态函数(比如在org.cocos2dx.lua.AppActivity.java中)名为Login public static void m ...

  2. Openlayers 3 热力图

    <body> <div id="map"></div> <script> var map = new ol.Map({ //初始化m ...

  3. 关于在jsp中的表达式

    列子: <%List<F_dd_tourist_info_markup> tourists = (List<F_dd_tourist_info_markup>) requ ...

  4. windows程序设计(三)

    MFC所有封装类一共200多个,但在MFC的内部技术不只是简单的封装 MFC的内部总共有六大关键技术,架构起了整个MFC的开发平台 一.MFC的六大关键技术包括: a).MFC程序的初始化过程 b). ...

  5. java 线程的中断

    Example12_6.java public class Example12_6 { public static void main(String args[]) { ClassRoom room6 ...

  6. 1--OC -- HelloWorld

      一.点击Xcode,选择“Create a new Xcode project” 二.左边选择“OS X Application”,右边选择“Command Line Tool”,Next 三.输 ...

  7. 二叉树,平衡树,红黑树,B~/B+树汇总

    二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree).这四种树都具备下面几个优势: (1) 都是动态结构.在删除,插入操作的时候,都不需要彻底重建原始的索引树 ...

  8. If only it could be all the same like we first me

    为什么 你当时对我好 Why? You nice to me at that time. 又为什么 现在变得冷淡了 Why? Now you give a cold shoulder to me. 我 ...

  9. jQuery 1.9使用$.support替代$.browser的使用方法

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support jQuery 从 1.9 版开始,移除了 $.browser ...

  10. MyEclipse9,MyEclipse10 安装ADT

    Eclipse安装ADT 时步骤是开 Eclipse IDE,进入菜单中的 "Help" -> "Install New Software" ,点击Add ...