Chinaunix首页 | 论坛 | 博客
  • 博客访问: 451228
  • 博文数量: 42
  • 博客积分: 1325
  • 博客等级: 中尉
  • 技术积分: 1312
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-13 18:00
个人简介

呵~~~呵~~~

文章分类

全部博文(42)

文章存档

2016年(3)

2015年(1)

2014年(2)

2013年(2)

2012年(7)

2011年(11)

2010年(3)

2009年(13)

我的朋友

分类: LINUX

2013-01-29 09:12:31

 


子网掩码转换为IP范围

在网络应用中,经常需要将子网掩码转换为IP范围,以便进行进一步的计算.
以下是转换的原理及代码:

一 子网掩码的作用, 就是将某个IP地址划分为'子网编号'和'主机地址'
   掩码格式       [子网编号:26bit               ]主机地址:6bit
   172.16.2.64/26 [10101100 00010000 00000010 01]000000
   172.16.2.96/26 [10101100 00010000 00000010 01]100000
   6bit的主机地址, 可以容纳63个编号. 则上面两个掩码的范围是
   掩码格式       IP范围
   172.16.2.64/26 [172.16.2.64 - 172.16.2.127]
   172.16.2.96/26 [172.16.2.96 - 172.16.2.127] *上一条的子集

二 算法
typedef struct
{
u_int32_t min;
u_int32_t max;
}ip_range_t;

int str2iprange( ip_range_t *ipr, char *sipr)
{
char sip[16];
char smask[3];
sscanf( sipr, "%[^/]/%s", sip, smask);

ipr->min = ntohl(inet_addr( sip));
ipr->max = (ipr->min & ~( (0x1 << (32 - atoi(smask))) - 1)) + ( (0x1 << (32 - atoi(smask))) - 1);
}

三 测试
ip_range_t ipr;
str2iprange( &ipr, "172.16.2.94/24");

struct in_addr min = { htonl( ipr.min)};
printf("%s - ", inet_ntoa( min));

struct in_addr max = { htonl( ipr.max)};
printf("%s \n", inet_ntoa( max));

输出结果:
172.16.2.94 - 172.16.2.127

END

阅读(3284) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~