设为首页 加入收藏

TOP

C语言实现IP地址合法性检测和子网匹配(一)
2015-01-22 20:49:57 来源: 作者: 【 】 浏览:15
Tags:语言 实现 地址 合法性 检测 子网 匹配
#include 
  
   
#include 
   
     #ifdef WIN32 #include 
    
      #else #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
         
           #include 
          
            #include 
           
             #include 
            
              #include 
             
               #include 
              
                #include 
               
                 #include 
                
                  #include 
                 
                   #include 
                  
                    #include 
                   
                     #include 
                    
                      #include 
                     
                       #ifdef WIN32 #pragma comment(lib,"wsock32.lib") #endif /*参数UINT32都为网络字节顺序。*/ /*IP地址是否合法, 合法返回TURE,失败返回FALSE*/ int netIpIsValid(_UINT32 IP) { int i; struct in_addr addr; addr.s_addr = IP; i = inet_addr(inet_ntoa(addr)); if((i == 0)||(i == 0xffffffff)) return FALSE; else return TRUE; } /*MASK子网掩码是否合法, 合法返回TURE,失败返回FALSE*/ int netMaskIsValid(_UINT32 mask) { int i; unsigned long ii; i = netIpIsValid(mask); if(i==TRUE) { ii = ntohl(mask); if((ii|ii-1)==0xffffffff) { return TRUE; } } return FALSE; } /*MASK子网掩码是否合法, 合法返回TURE,失败返回FALSE*/ int netMaskAndIpIsValid(_UINT32 IP, _UINT32 mask) { int i; int a, b=0, c; i = netIpIsValid(IP); if(i!=TRUE) return FALSE; i = netMaskIsValid(mask); if(i!=TRUE) return FALSE; a = IP&0x000000ff; b = ntohl(mask); /*首先与默认子网掩码比较*/ if(a>0&&a<127) { if(mask<0x000000ff) return FALSE; if(mask>0x000000ff) b-=0xff000000; } if(a>=128&&a<=191) { if(mask<0x0000ffff) return FALSE; if(mask>0x0000ffff) b-=0xffff0000; } if(a>=192&&a<=223) { if(mask<0x00ffffff) return FALSE; if(mask>0x00ffffff) b-=0xffffff00; } /*每个子网段的第一个是网络地址,用来标志这个网络,最后一个是广播地址,用来代表这个网络上的所有主机.这两个IP地址被TCP/IP保留,不可分配给主机使用.*/ c = ~ntohl(mask)&ntohl(IP); if(c==0||c==~ntohl(mask)) return FALSE; /*RFC 1009中规定划分子网时,子网号不能全为0或1,会导致IP地址的二义性*/ if(b>0) { c = b&(ntohl(IP)); if(c==0||c==b) return FALSE; } return TRUE; } /*测试主网和子网是否匹配,也可测试两个主机IP是否在同一网段内*/ int netIPAndSubnetValid(_UINT32 IP, _UINT32 subIP, _UINT32 mask) { int i; int addr1, addr2; i = netMaskAndIpIsValid(IP, mask); if(i!=TRUE) return FALSE; i = netMaskAndIpIsValid(subIP, mask); if(i!=TRUE) return FALSE; addr1 = IP&mask; addr2 = subIP&mask; if(addr1!=addr2) return FALSE; return TRUE; } 
                     
                    
                   
                  
                 
                
               
              
             
            
           
          
         
        
       
      
     
    
   
  


技术实现及功能:
1. 用C语言实现
2. 判断IP地址是否合法
3. 判断MASK是否合法
4. 判断MASK和IP地址组合是否合法

测试:

测试环境:win7 VC++
测试结果:
1、测试IP是否合法:
输入IP为0xFFFFFFFF即255.255.255.255,结果为不合法;
输入IP为0x00000000即0.0.0.0,结果为不合法;
输入IP为0x00000000--0xFFFFFFFF即在0.0.0.0--255.255.255.255之间(全0和全1除外),结果为合法。
2、测试子网掩码是否合法:
输入0x00C0FFFF(1111 1111.1111 1111.1100 0000),结果合法;
输入一个无符号int型数,二进制形式为 左边为全1右边为全0,结果合法,其余形式不合法。
3、测试子网掩码和IP是否匹配:
输入IP为0x410AA8C0即192.168.10.65(C类IP),输入子网掩码为0xC0FFFFFF,结果匹配,输入小于0x00FFFFFF的子网掩码时不匹配;
输入IP为0x0141A885即133.168.65.1(B类IP),输入子网掩码为0x00C0FFFF,结果匹配,输入小于0x0000FFFF的子网掩码时不匹配;
输入IP为0x0100413F即63.65.0.1(A类IP),输入子网掩码为0x0000C0FF,结果匹配,输入小于0x000000FF的子网掩码时不匹配。
子网段内第一个和最后一个IP不可分配;子网号全0或全1的子网不可用,此时的结果都为不匹配。
4、测试两个IP是否在同一子网段:
输入两个IP为0x0C81C480 0x118FC480,输入子网掩码为0x00C0FFFF,结果为两个IP在同一网段;
输入两个IP为0x0C81C480 0x117FC480,输入子网掩码为0x00C0FFFF,结果两个IP不在同一网段。

备注:测试数据为无符号int型,网络字节顺序。

补充知识:

一般的,32位的IP地址分为两部分,即网络号和主机号,我们分别把他们叫做IP地址的“网间网部分”和“本地部分”。子网编址技术将本地部分进一步划分为“物理网络”部分和“主机”部分,其中“物理网络”用于标识同一IP网络地址下的不同物理网络,即是“子网”。

A类IP段  0.0.0.0 到127.255.255.255

 B类IP段  128.0.0.0 到191.255.255.255

 C类IP段  192.0.0.0 到223.255.255.255

XP默认分配的子网掩码每段只有255或0

  A类的默认子网掩码 255.0.0.0     一个子网最多可以容纳1677万多台电脑

  B类的默认子网掩码 255.255.0.0    一个子网最多可以容纳6万台电脑

  C类的默认子网掩码 255.255.255.0   一个子网最多可以容纳254台电脑
以C类地址为例。IP地址中的前3个字节表示网络号,后一个字节既表明子网号,又说明主机号,还说明两个IP地址是否属于一个网段。如果属于同一网络区间,这两个地址间的信息交换就不通过路由器。如果不属同一网络区间,也就是子网号不同,两个地址的信息交换就要通过路由器进行。

看一个例子:
A的IP地址:11000000,10101000,00000000,00000101
子网掩码:11111111,11111111,11111111,00000000
B的IP地址:11000000,10101000,00000000,00010110

看上边的内容,子网掩码在左边一共有2

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇数据结构(C实现)------- 链栈 下一篇编程算法 - 组合数 代码(C)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: