C++基础--htons(),htonl(),ntohs(),ntohl()
将多字节整数类型的数据,从主机的字节顺序转化为网络字节顺序
原型:
#include <netinet/in.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
描述:
不同的计算机里对它们的多字节整数(例如:一个大于char的整数)使用不同的字节顺序。这就意
味着,如果你从intel的盒子中send()一个两个字节的短整数到一个Mac中(在它们成为Intel之前),一个计算机认为是数字1,而另外一个计
算机会认为它是数字256,反之亦然。
解决这个问题的办法是:所有的人撇开它们的不同之处,同意摩托罗拉和IBM的顺序是正确的,而Intel使用的是怪异的方式,所以我们在将他们发送 出去之前把所有的字节以“正序”方式排列。既然Intel是一个“反序”的机器,所以调用我们需要的,以“网络字节顺序”排列的字节是很正确的。所以这些 函数把你的本机字节顺序转化为网络字节顺序然后再转化回来。
(这就意味着,在Intel上面,这些函数把所有的字节调换过来,而在PowerPC上面,它们什么都没有做,因为在那上面字节本身是以网络字节顺序排列的。但是你依然要在你的程序当中使用它们,因为别的人有可能将它们应用到Intel机器当中,使之依然正常的运行。)
注意到这些类型包含32-位(4个字节,可能是整数)和16-位(两个字节和short很像)数据。64-位的机器可以使用htonll()作为64-位整数,但是我们没有见到它。你必须自己写。
不管怎样,使用这些函数决定于你要从主机字节顺序(你的电脑上的)还是网络字节顺序转化。如果是"host",函数的第一个字母为"h",否 则"network"就为"n"。函数的中间字母总是"to",因为你要从一个转化到另一个,倒数第二个字母说明你要转化成什么。最后一个字母是数据的大 小,"s"表示short,"l"表示long。于是:
htons() host to network short
htonl() host to network long
ntohs() network to host short
ntohl() network to host long
返回值:
每个函数返回转化后的值
例子:
uint32_t some_long = 10;
uint16_t some_short = 20;
uint32_t network_byte_order;
// convert and send
network_byte_order = htonl(some_long);
send(s, &network_byte_order, sizeof(uint32_t), 0);
some_short == ntohs(htons(some_short)); // this expression is true