4位为1,那这样的意思就是如果两个IP地址的前24位都相同的话,那这两个IP地址就是在同一个网段内,看到我红色标记的A和B的地址都相同,那这就说明A和B在同一个网段内。
再看一个例子,如果还是A地址的数据发到C地址,C的IP地址为192.168.56.21
A的IP地址:11000000,10101000,00000000,00000101
子网掩码:11111111,11111111,11111111,00000000
C的IP地址:11000000,10101000,00111000,00010101
看上边的A和C,按照子网掩码的要求,如果C的前24位和A的前24位都相同的话,那么A和C才是同一网段的,看上边C的地址,我用蓝色来标注不同的位数,这样A 和C就不在同一个网段内,路由器就不能直接把A要发给C的数据直接经过一个路由器给发送过去,这样路由器就要先将A的数据转发到另外一个路由器(一个不行就继续往下发),然后再发到C上。
● 字节序转换函数
htons 把 unsigned short 类型从主机序转换到网络序
htonl 把 unsigned long 类型从主机序转换到网络序
ntohs 把 unsigned short 类型从网络序转换到主机序
ntohl 把 unsigned long 类型从网络序转换到主机序
这几个函数很好记,比如htons中hton代表host to network, s代表unsigned short
char FAR * inet_ntoa( struct in_addr in);
将一个IP转换成一个互联网标准点分格式的字符串。
in_addr_t inet_addr(const char *cp);
将一个点分十进制的IP转换成一个长整数型数(u_long类型)。返回值已是网络字节顺序,可以直接作为internet 地址
一个函数返回值为TRUE或FALSE 只有这两种返回值时 在判断返回值时不用 if(i==TRUE)或if(i==FALSE),而用if(i) if(!i) 编程规范。
inet_ntoa()返回的字符串是临时装在一个静态分配的缓冲区里面,下一次调用此函数的时候缓冲区会被重写