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

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
  1. /*added by xyang for ip check 2011-08-13*/  
  2. int if_a_string_is_a_valid_ipv4_address(const char *str)  
  3. {  
  4.     struct in_addr addr;  
  5.     int ret;  
  6.     volatile int local_errno;  
  7.   
  8.     errno = 0;  
  9.     ret = inet_pton(AF_INET, str, &addr);  
  10.     local_errno = errno;  
  11.     if (ret > 0);  
  12.     else if (ret < 0)  
  13.         printf("EAFNOSUPPORT: %s\n", strerror(local_errno));  
  14.     else  
  15.         printf("\"%s\" is not a valid IPv4 address\n", str);  
  16.     return ret;  


 

2.     判断子网掩码的方法

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

[cpp]  view plain  copy
  1. int IsSubnetMask(char* subnet)  
  2. {  
  3.     if(if_a_string_is_a_valid_ipv4_address (subnet))  
  4.     {  
  5.         unsigned int b = 0, i, n[4];  
  6.         sscanf(subnet, "%u.%u.%u.%u", &n[3], &n[2], &n[1], &n[0]);  
  7.         for(i = 0; i < 4; ++i) //将子网掩码存入32位无符号整型  
  8.             b += n[i] << (i * 8);   
  9.         b = ~b + 1;  
  10.         if((b & (b - 1)) == 0)   //判断是否为2^n  
  11.             return 1;  
  12.     }  
  13.     return 0;  


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

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要使用C语言IP地址的合法性进行判断,可以使用正则表达式或者字符串处理函数进行校验。以下是一个示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> bool isValidIPAddress(const char* ipAddress) { // 分割IP地址 char* token = strtok(ipAddress, "."); int num; // 检查每个分割的部分是否合法的数字 while (token != NULL) { num = atoi(token); if (num < 0 || num > 255) { return false; } // 检查数字前后是否有多余的0 char temp[4]; sprintf(temp, "%d", num); if (strcmp(temp, token) != 0) { return false; } token = strtok(NULL, "."); } return true; } int main() { const char* ipAddress = "192.168.0.1"; if (isValidIPAddress(ipAddress)) { printf("IP地址合法\n"); } else { printf("IP地址不合法\n"); } return 0; } ``` 要使用C语言子网掩码进行合法判断,可以使用与IP地址类似的方法,检查每个分割部分是否是0或者255,并且检查位数是否正确。以下是一个示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> bool isValidSubnetMask(const char* subnetMask) { // 分割子网掩码 char* token = strtok(subnetMask, "."); int num; bool allOnes = false; // 检查每个分割的部分是否合法的数字 while (token != NULL) { num = atoi(token); if (num < 0 || num > 255) { return false; } // 检查数字前后是否有多余的0 char temp[4]; sprintf(temp, "%d", num); if (strcmp(temp, token) != 0) { return false; } // 检查位数是否正确 if (!allOnes && num != 255) { if (num == 0) { allOnes = true; } else { return false; } } else if (allOnes && num != 0) { return false; } token = strtok(NULL, "."); } return true; } int main() { const char* subnetMask = "255.255.255.0"; if (isValidSubnetMask(subnetMask)) { printf("子网掩码合法\n"); } else { printf("子网掩码合法\n"); } return 0; } ``` 这些示例代码仅供参考,具体的判断逻辑可以根据实际需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值