Chinaunix首页 | 论坛 | 博客
  • 博客访问: 570401
  • 博文数量: 146
  • 博客积分: 5251
  • 博客等级: 大校
  • 技术积分: 1767
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-10 15:58
文章分类
文章存档

2010年(12)

2008年(129)

2007年(5)

我的朋友

分类: LINUX

2008-05-14 20:27:52

1)IP地址,是由网络地址的部分加上主机地址的部分组成的。例如:

     172.24.12.61 (A/28)

     这个描述方式表示了这个IP地址所属的网络是一个28位掩码的网络。所谓网络掩码,是一个连1+连0组成的IP地址类型的地址,一个掩码的末尾有多少位连续的0(e.g. x 个),就表示这个子网可以有 2^x 个主机地址。IP 地址最长也只有32位,所以 A/28 就表示前面28位都是1,那么最后就有4个0,所以这个网络的掩码就是 255.255.255.240。

     那么,上面那个IP地址的子网地址是怎么得出来的呢?就是用IP地址和子网掩码做一下“与”运算,即:

     172.24.12.61 & 255.255.255.240 = 172.24.12.48

     可见,这个子网的网络地址就是172.24.12.48,那么172.24.12.61 的主机地址就是13。

     补充一下,所谓“与”运算,其实是把十进制的数字换算成二进制以后的“与”。

     一个子网里,子网网络地址通常是不分配给主机用的,而且,子网的广播地址也是不分配的。子网广播地址指的就是子网网络地址的后面那几个0的作为主机地址的值都是1的IP地址。那么在这个例子里,子网广播地址就是:172.24.12.63。

     要判断两个IP地址是否属于同一子网,可以把两个IP地址分别与它们的子网掩码“与”一下,如果得到同一个子网地址,那就是属于同一子网的了。

2)在C++中,要把一个IP地址的字符串转换成一个可以直接用来做“与”运算的数字,可以用这个函数。

inet_addr()将网络地址转成二进制的数字
相关函数     inet_aton,inet_ntoa
表头文件
#include
#include
#include
定义函数     unsigned long int inet_addr(const char *cp);
函数说明     inet_addr()用来将参数cp所指的网络地址字符串转换成网络所使用的二进制数字。网络地址字符串是以数字和点组成的字符串,例如:“163.13.132.68”。
返回值     成功则返回对应的网络二进制的数字,失败返回-1。

3)C++中,反过来,如果要把一个这种运算完以后的二进制数字直接生成一个IP地址的字符串的话,可以用下面这个函数。

inet_ntoa()将网络二进制的数字转换成网络地址
相关函数     inet_addr,inet_aton
表头文件
#include
#include
#include
定义函数     char * inet_ntoa(struct in_addr in);
函数说明     inet_ntoa()用来将参数in所指的网络二进制的数字转换成网络地址,然后将指向此网络地址字符串的指针返回。
返回值     成功则返回字符串指针,失败则返回NULL。

结构in_addr定义如下
struct in_addr
{
unsigned long int s_addr;
};

4) 代码例子:

    unsigned long int ip = inet_addr(ipString.c_str());
    in_addr subnetIp;
    subnetIp.s_addr = ip &Mask;
    subnetIpAddr = inet_ntoa(subnetIp);

5) 说明:

      需要注意的是,在使用以上两个函数的时候,要在引用的头文件里加上上面所提到的三个头文件:

#include
#include
#include

      此外,在编译的时候,还需要在makefile 里加上两个链接库文件(nsl 和 socket)。例如:

c++ -g -lnsl -lsocket -o xxx.o ...

      否则的话,会出现 ld 的错误。

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