工作中经常碰到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”,若查不到就合法,否则不合法。