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

不说废话:

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");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值