全部博文(146)
分类: 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 的错误。