一 原理
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”,若查不到就合法,否则不合法。