今天主要是再次熟悉一下网络顺序和主机顺序的实现方法。htons和ntohs,htonl和htonl。
htonl()——"Host to Network Long"
ntohl()——"Network to Host Long"
htons()——"Host to Network short"
ntohs()——"Network to Host short"
网络字节顺序(Network Byte Order):按从高到底顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题。
主机字节顺序(Host Byte Order) : 不同的机器HBO不相同,与CPU设计有关,数据的顺序是有CPU决定的,而与操作系统无关。
由于不同CPU决定的字节顺序不一致,不同体系结构的机器之间无法通信,所以要转换成一种约定的数序,就是网络字节顺序。
所谓网络字节顺序(大尾顺序)就是指一个数在内存中存储的时候“高对低,低对高”(即一个数的高位字节存放于低地址单元,低位字节存放在高地址单元中)。但是计算机的内存存储数据时有可能是大尾顺序或者小尾顺序。
还有就是inet_addr和inet_ntoa
inet_addr将一个点分十进制的IP转换成一个长整数型数。in_addr_t inet_addr(const char* cp),正确执行返回一个无符号长整数型数,如果传入不合法字符串,返回INADDR_NONE
inet_ntoa将网络地址转换成点隔的字符串格式。char FAR* PASCAL FAR inet_ntoa( struct in_addr in); 若无错误发生,返回一个字符指针,否则的话,返回NULL。
有例外情况,当然这只是提醒一下如果连续inet_ntoa时,会出现只应用一次。看下面的例子
in_addr addr1,addr2;
u_long uNetwordAddr1,uNetwordAddr2;
uNetwordAddr1= inet_addr("192.168.0.74");
uNetwordAddr2 = inet_addr("211.100.21.179");
memcpy(&addr1, &uNetwordAddr1, 4);
memcpy(&addr2, &uNetwordAddr2, 4);
printf("%s : %s\n", inet_ntoa(addr1), inet_ntoa(addr2)); //注意这一句的运行结果
printf("%s\n", inet_ntoa(addr1));
printf("%s\n", inet_ntoa(addr2));
inet_ntoa返回一个char *,而这个char *的空间是在inet_ntoa里面静态分配的,所以inet_ntoa后面的调用会覆盖上一次的调用。第一句printf的结果只能说明在printf里面的可变参数的求值是从右到左的,仅此而已。