htonl,ntohl,NBO客户端和服务器

时间:2013-05-18 02:15:38

标签: sockets networking byte winsock

我正在编写服务器和客户端,我有一些整数要通过。

在我的服务器应用程序中,我从客户端收到一个整数。

在客户端,我是否在整数上调用ntohl或htonl? 如果我调用其中任何一个,当我收到整数时,我是否必须再次调用ntohl或htonl?或者我只在服务器端调用ntohl / htonl,而不是客户端?

换句话说,当每个整数使用htonl或ntohl的时候/在哪里以及多少次?

另外,我是否必须为字符串/字符数组执行ntohl / htonl?字符是否必须转换?

3 个答案:

答案 0 :(得分:1)

发送整数时,请始终调用hton...()以确保将字节从发送计算机的本机字节顺序转换为网络字节顺序。

读取整数时,请始终调用ntoh...()以确保将字节从网络字节顺序转换为接收计算机的本机字节顺序。

在本机字节顺序与网络字节顺序相同的机器上,这些函数实现为no-ops。在本机字节顺序不相同的机器上,函数执行字节交换。

答案 1 :(得分:1)

  

在客户端我是否在整数上调用ntohl或htonl?

它与您是客户端还是服务器无关。它与您是发送还是接收有关。如果您要发送,则需要网络字节顺序,因此请调用htonl()。如果您正在接收,则需要主持人订单,因此请致电ntohl().

  

如果我调用其中任何一个,当我收到整数时,我是否必须再次调用ntohl或htonl?

是。发送方应该将数据放入网络字节顺序;接收者必须将其置于主机顺序,为他的本地主机。

  

换句话说,当每个整数使用htonl或ntohl的时候/在哪里以及多少次?

发送时

htonl();收到时ntohl()

答案 2 :(得分:0)

此方案中的典型设置是在客户端中调用htonl(因为您要将整数放入网络协议顺序)并且服务器中的ntohl(因为您想要从网络转换回主机顺序)。

字符串没有ntohl等等(尽管您必须安排客户端和服务器就所使用的字符编码达成一致,即双方都使用UTF-8)。