只针对 x.x.x.x/mask 和 x.x.x.x-y 这两种格式的地址段解析
static int parse1(const char *str, uint32_t *begin, uint32_t *end)
{
int n, f1, f2, f3, f4, m;
n = sscanf(str, "%u.%u.%u.%u/%u",&f1, &f2, &f3, &f4, &m);
if (n != 5)
return -1;
if (f1 > 255)
return -1;
if (f2 > 255)
return -1;
if (f3 > 255)
return -1;
if (f4 > 255)
return -1;
if (m == 0 || m > 32)
return -1;
*begin = (f1 << 24) | (f2 << 16) | (f3 << 8) | f4;
m = m == 32 ? 0 : ((1 << (32 - m)) - 1);
*end = *begin | m;
return 0;
}
static int parse2(const char *str, uint32_t *begin, uint32_t *end)
{
int n, f1, f2, f3, f4, f5;
n = sscanf(str, "%u.%u.%u.%u-%u",&f1, &f2, &f3, &f4, &f5);
if (n != 5)
return -1;
if (f1 > 255)
return -1;
if (f2 > 255)
return -1;
if (f3 > 255)
return -1;
if (f4 > 255)
return -1;
if (f5 < f4 || f5 > 255)
return -1;
*begin = (f1 << 24) | (f2 << 16) | (f3 << 8) | f4;
*end = (f1 << 24) | (f2 << 16) | (f3 << 8) | f5;
return 0;
}
参数: str:字符串地址段 begin: 首地址的主机字节顺序 end : 尾地址的主机字节顺序 使用end - begin 可以获得地址段中地址的个数, 使用htonl 函数可以将主机字节顺序转换为网络字节顺序
unsigned int i = 0, cnt = 0;
in_addr_t addr;
for (i = startip; i <= endip; i++) {
addr = htonl(i);
printf("IP = %ld\n",i);
cnt++;
}
如此可获取每个IP地址的网络字节顺序或主机字节顺序
|