检查ip地址和子网掩码的有效性

来源:互联网 发布:淘宝新开网店怎么推广 编辑:程序博客网 时间:2024/04/28 19:40

不说废话:

1、检查ip的有效性

int isIpValid(const char *ip){int ipPartArr[IP_PARTS_CNT] = {0};assert(ip);/* 格式化ip */if (IP_PARTS_CNT != sscanf(ip, "%d.%d.%d.%d",&ipPartArr[0], &ipPartArr[1], &ipPartArr[2], &ipPartArr[3])){return 0;}/* 检查各段取值范围 */if (((ipPartArr[0] <= IP_NUM_0) || (ipPartArr[0] > IP_NUM_255))|| ((ipPartArr[1] < IP_NUM_0) || (ipPartArr[1] > IP_NUM_255))|| ((ipPartArr[2] < IP_NUM_0) || (ipPartArr[2] > IP_NUM_255))|| ((ipPartArr[3] < IP_NUM_0) || (ipPartArr[3] > IP_NUM_255))){return 0;}else{return 1;/* valid */}}

2、检查子网掩码的有效性

int isMaskValid(const char *mask){int maskPartArr[IP_PARTS_CNT] = {0};const int validMaskPartArr[]= {0X00, 0X80, 0XC0, 0XE0, 0XF0, 0XF8, 0XFC, 0XFE, 0XFF};/* 有效的子网掩码取值 */int i = 0;int has_zero = 0;assert(mask);/* 格式化mask */if (IP_PARTS_CNT != sscanf(mask, "%d.%d.%d.%d",&maskPartArr[0], &maskPartArr[1], &maskPartArr[2], &maskPartArr[3])){return 0;}/* 检查各段mask取值是否有效 */for (i=0; i<IP_PARTS_CNT; ++i){if (!isMaskInRange(maskPartArr[i], validMaskPartArr, MASK_PART_VALID_CNT))return 0;/* 取值无效 *//* 子网掩码由一段连续的1和一段连续的0组成,出现0之后绝不可再出现1 */if (0 == has_zero && 0XFF != maskPartArr[i])/* 首次出现0 */{has_zero = 1;continue;/* 检查下一段 */}if (1 == has_zero && 0X00 != maskPartArr[i])/* 在出现0的情况下,又出现了1 */return 0;}return 1;}
其中isMaskInRange用于检查各段mask取值是否有效,定义如下:

/* 检查各段mask的取值是否有效 */int isMaskInRange(int mask, const int validMaskPartArr[], int parts_cnt){int i = 0;int ret = 1;/* 默认有效 */assert(validMaskPartArr);for (i=0; i<parts_cnt; ++i){if (mask == validMaskPartArr[i])break;}if (i >= parts_cnt)/* 没有找到,无效取值 */ret = 0;return ret;}

3、下面是测试代码:

/* 测试ip的有效性 */void test_isIpValid(void){printf("Begin test isIpValid...\n");assert(1 == isIpValid("1.2.3.4"));assert(1 == isIpValid("   133.133.133.133"));assert(0 == isIpValid("1a.1.c1.1"));assert(0 == isIpValid("123.1..1"));assert(0 == isIpValid("0.1.2.3"));assert(0 == isIpValid("122.1.256.3"));printf("End test isIpValid, successfully!\n");}/* 测试mask的有效性 */void test_isMaskValid(void){printf("Begin test isMaskValid...\n");assert(1 == isMaskValid("0.0.0.0"));assert(1 == isMaskValid("255.0.0.0"));assert(1 == isMaskValid("255.255.255.255"));assert(0 == isMaskValid("255.0.255.0"));assert(0 == isMaskValid("255.123.0.0"));assert(0 == isMaskValid("255.248.255.0"));assert(0 == isMaskValid("255.256.0.0"));printf("End test isMaskValid, successfully!\n");}

原创粉丝点击