当前位置: 技术问答>linux和unix
求子网掩码的校验函数
来源: 互联网 发布时间:2017-01-14
本文导语: 给一个字符串,要求判断是否是合法的子网掩码。 如 char mask_ok[]="255.255.255.0" char mask_err[]="255.0.255.0" mask_ok 是合法的,mask_err是非法的。 | #include #include #include #include #include int checkNetmask(const ...
给一个字符串,要求判断是否是合法的子网掩码。
如
mask_ok 是合法的,mask_err是非法的。
如
char mask_ok[]="255.255.255.0"
char mask_err[]="255.0.255.0"
mask_ok 是合法的,mask_err是非法的。
|
#include
#include
#include
#include
#include
int checkNetmask(const char *netmask)
{
char bigEdianBytes[4];
if(inet_pton(AF_INET,netmask,bigEdianBytes)> ffs(mask) == 0)
printf("%sn", "good");
else
printf("%sn", "bad");
return 0;
}
|
或者
#include
#include
#include
#include
int
main(int argc, char *argv[])
{
unsigned int mask;
char mask_good[] = "255.255.255.0";
char mask_bad[] = "255.0.255.0";
mask = inet_addr(mask_good);
if (((~mask + 1) & ~mask) == 0 )
printf("%sn", "good");
else
printf("%sn", "bad");
mask = inet_addr(mask_bad);
if (((~mask + 1) & ~mask) == 0 )
printf("%sn", "good");
else
printf("%sn", "bad");
return 0;
}
|
哦哦,我懂楼主意思了。。。是要求只能出现1111111111100000000/0000000000111111这种序列。。。
先inet_addr转const char*为4字节网络序。
举例:char mask_ok[]="255.255.255.0" ,inet_addr转化后,也就是[0]字节是255,[3]字节是0.
将这4字节当做unsigned long解析,会根据本机大小端有所不同,但肯定是11111111100000(大端)或者是000000111111111(小端)之中的一种。
怎么判断呢? 从低到高遍历l的每一位,如果当前位和前一位不同,那么找到了分界。 之后判断高位一边是否有不同的bit位即可。
一会写个代码。
|
哎呀,写出来了才发现原来掩码必须是左边1,右边0,这个问题还是不要当做Long了,会引入本机字节序问题。
直接逐个判断4字节就可以了。
直接逐个判断4字节就可以了。