您的位置:首页 > 编程语言 > C语言/C++

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

2017-05-22 11:20 991 查看
http://blog.csdn.net/dxdxsmy/article/details/7237955

工作中经常碰到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合法的方法

[cpp] view
plain copy

/*added by xyang for ip check 2011-08-13*/  

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,如果满足就为合法掩码。

[cpp] view
plain copy

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”,若查不到就合法,否则不合法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c 子网掩码 IP