代码及注释如下:
#include <STDIO.H>
#include <STRING.h>
#include <WinSock2.h>
bool IsSubnetMask(char* subnet);
bool if_a_string_is_a_valid_ipv4_address(const char *str) ;
#pragma comment(lib,"Ws2_32")
void main()
{
if (IsSubnetMask("256.0.0.0"))
{
printf("succeed\n");
}
else
{
printf("failed\n");
}
}
/****************************************************************************/
/* 下面给的例子是这样的:先验证是否为合法IP,然后将掩码转化成32无符号整型, */
/*取反为000...00111...1,然后再加1为00...01000...0,此时为2^n, */
/*如果满足就为合法掩码。 */
/*或者,查找字符串中的子串“01”,若查不到就合法,否则不合法。 */
/****************************************************************************/
bool 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 true;
}
else
{
printf("子网掩码的二进制的1必须是连续的!\n");
return false;
}
}
else
{
printf("子网掩码的格式不正确!\n");
return false;
}
}
/************************************************************************/
/* 判断IP合法的方法 */
/**********************************************************************/
bool if_a_string_is_a_valid_ipv4_address(const char *str)
{
if (inet_addr(str) == INADDR_NONE)
return false;
else
return true;
}