判断任意两台计算机的IP地址是否属于同一子网络与sscanf

今天在网上看到这个题目:“判断任意两台计算机的IP地址是否属于同一子网络”:

子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。

最为简单的理解就是两台计算机各自的IP地址与子网掩码进行AND运算后,如果得出的结果是相同的,则说明这两台计算机是处于同一个子网络上的,可以进行直接的通讯。就这么简单。

请看以下示例:

运算演示之一:

IP地址:192.168.0.1

子网掩码:255.255.255.0

AND运算

转化为二进制进行运算:

IP地址:11010000.10101000.00000000.00000001  子网掩码:11111111.11111111.11111111.00000000  AND运算:11010000.10101000.00000000.00000000  转化为十进制后为: 192.168.0.0

 

运算演示之二: IP地址:192.168.0.254  子网掩码:255.255.255.0  AND运算

转化为二进制进行运算: IP地址:11010000.10101000.00000000.11111110  子网掩码:11111111.11111111.11111111.00000000  AND运算:11010000.10101000.00000000.00000000  转化为十进制后为:192.168.0.0

 

通过以上对两台计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0,所以这二台计算机可视为是同一子网络。

  • 接口说明

原型:

    int IsSameSubNetwork(char * pcIp1, char * pcIp2, char * pcSubNetworkMask);

输入参数:

    char * pcIP1计算机1的IP地址,格式:“192.168.0.254”

    char * pcIP2计算机2的IP地址,格式:“192.168.0.1”

    char * pcSubNetworkMask子网掩码,格式:“255.255.255.0”

 

返回值:

    0:IP1与IP2不属于同一子网络。

    1:IP1与IP2属于同一子网络。

 

本题的难点主要就是在1、如何将IP字符串分解;2、如何实现AND操作。

当然了,实现AND操作直接通过&操作符即可实现。

那么字符串的分解如何实现呢,如果IP地址每一位的字符数都是恒定的,那就很容易处理,那这种用“.”来分隔的字符串该怎么处理。

下面就介绍一个非常有用的函数,可能一直没有被注意到—— sscanf/sscanf_s

调用函数需要头函数“stdio.h

定义函数 int sscanf (const char *str,const char * format,........);

函数说明 
 sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结果存于对应的参数内。

返回值 成功则返回参数数目,失败则返回-1,错误原因存于errno中。 返回0表示失败    否则,表示正确格式化数据的个数    例如:sscanf(str,"%d%d%s", &i,&i2, &s);    如果三个变成都读入成功会返回3。    如果只读入了第一个整数到i则会返回1。证明无法从str读入第二个整数。

 

     1. 常见用法。

  charstr[512]={0};
  sscanf("123456","%s",str);
  printf("str=%s",str);

  2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。

  sscanf("123456","%4s",str);
  printf("str=%s",str);

  3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。

  sscanf("123456abcdedf","%[^]",str);
  printf("str=%s",str);

 4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。

  sscanf("123456abcdedfBCDEF","%[1-9a-z]",str);
  printf("str=%s",str);

  5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。

  sscanf("123456abcdedfBCDEF","%[^A-Z]",str);
  printf("str=%s",str);

那就把我写的判断函数给大家参考一下吧:

 

 1 #include<stdio.h>
 2 /*
 3 功能: 判断两台计算机IP地址是同一子网络。
 4 原型:
 5     int IsSameSubNetwork(char * pcIp1, char * pcIp2, char * pcSubNetworkMask);
 6 
 7 输入参数:
 8     char * pcIP1: 计算机1的IP地址,格式:“192.168.0.254”;
 9     char * pcIP2: 计算机2的IP地址,格式:“192.168.0.1”;
10     char * pcSubNetworkMask: 子网掩码,格式:“255.255.255.0”;
11 
12 返回值:
13     0:IP1与IP2不属于同一子网络;
14     1:IP1与IP2属于同一子网络;
15 */
16 
17 int IsSameSubNetwork(char * pcIp1, char * pcIp2, char * pcSubNetworkMask)
18 {
19     /*在这里实现功能*/
20     int ip1[4] = {0};    
21     int ip2[4] = {0};   
22     int ip3[4] = {0};   
23     sscanf_s(pcIp1, "%d.%d.%d.%d", &ip1[0], &ip1[1],&ip1[2],&ip1[3]);    
24     sscanf_s(pcIp2, "%d.%d.%d.%d", &ip2[0], &ip2[1],&ip2[2],&ip2[3]);   
25     sscanf_s(pcSubNetworkMask, "%d.%d.%d.%d", &ip3[0], &ip3[1],&ip3[2],&ip3[3]);   
26   
27     for (int i=0;i<4;i++)  
28     {  
29         if (ip1[i]<0 || ip1[i]>255 || ip2[i]<0 || ip2[i]>255 || ip3[i]<0 || ip3[i]>255)  
30             return 0;  
31     }  
32       
33     if ((ip1[0] & ip3[0]) == (ip2[0] & ip3[0]))  
34         if((ip1[1] & ip3[1]) == (ip2[1] & ip3[1]))  
35             if((ip1[2] & ip3[2]) == (ip2[2] & ip3[2]))  
36                 if((ip1[3] & ip3[3]) == (ip2[3] & ip3[3]))  
37                     return 1;  
38     return 0;  
39 
40 }

 

posted on 2013-12-20 22:49  C##J  阅读(1934)  评论(0)    收藏  举报

导航