php判断一个合法掩码,判断IP及子网掩码是否合法(C语言实现)

工作中经常碰到IP及子网掩码是否合法的判断,虽然可以google出答案,还是整理下记录下来,以后用时方便。

一 原理

1. IP合法

关于IP地址的合法性验证很简单,方法也很多,比如字符串分解、正则表达式等。

2. 子网掩码是否合法

简单来讲,子网掩码就类似这样一串数字,前面一段是连续的1,

类似“111111111“,后面一段是连续的0,类似“00000”,这样合法的样子是“11111111000000000”,总共是32位。

一个合法的子网掩码要满足如下条件:

1、是合法的IP地址

2、二进制码要相邻,即形如111...11000...0的形式

3、与IP地址对应,A、B、C、D各类IP地址都有对应的掩码范围

二 方法

1. 判断IP合法的方法

intif_a_string_is_a_valid_ipv4_address(constchar*str)

{

structin_addr addr;

intret;

volatileintlocal_errno;

errno = 0;

ret = inet_pton(AF_INET, str, &addr);

local_errno = errno;

if(ret > 0);

elseif(ret 

printf("EAFNOSUPPORT: %s\n", strerror(local_errno));

else

printf("\"%s\" is not a valid IPv4 address\n", str);

returnret;

int if_a_string_is_a_valid_ipv4_address(const char *str)

{

struct in_addr addr;

int ret;

volatile int local_errno;

errno = 0;

ret = inet_pton(AF_INET, str, &addr);

local_errno = errno;

if (ret > 0);

else if (ret < 0)

printf("EAFNOSUPPORT: %s\n", strerror(local_errno));

else

printf("\"%s\" is not a valid IPv4 address\n", str);

return ret;

2. 判断子网掩码的方法

下面给的例子是这样的:先验证是否为合法IP,然后将掩码转化成32无符号整型,取反为000...00111...1,然后再加1为00...01000...0,此时为2^n,如果满足就为合法掩码。

intIsSubnetMask(char* subnet)

{

if(if_a_string_is_a_valid_ipv4_address (subnet))

{

unsignedintb = 0, i, n[4];

sscanf(subnet,"%u.%u.%u.%u", &n[3], &n[2], &n[1], &n[0]);

for(i = 0; i 

b += n[i] <

b = ~b + 1;

if((b & (b - 1)) == 0)//判断是否为2^n

return1;

}

return0;

int IsSubnetMask(char* subnet)

{

if(if_a_string_is_a_valid_ipv4_address (subnet))

{

unsigned int b = 0, i, n[4];

sscanf(subnet, "%u.%u.%u.%u", &n[3], &n[2], &n[1], &n[0]);

for(i = 0; i < 4; ++i) //将子网掩码存入32位无符号整型

b += n[i] << (i * 8);

b = ~b + 1;

if((b & (b - 1)) == 0) //判断是否为2^n

return 1;

}

return 0;

或者这样也行,查找字符串中的子串“01”,若查不到就合法,否则不合法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值