判断任意两台计算机的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 }
浙公网安备 33010602011771号