我正在编写服务器和客户端,我有一些整数要通过。
在我的服务器应用程序中,我从客户端收到一个整数。
在客户端,我是否在整数上调用ntohl或htonl? 如果我调用其中任何一个,当我收到整数时,我是否必须再次调用ntohl或htonl?或者我只在服务器端调用ntohl / htonl,而不是客户端?
换句话说,当每个整数使用htonl或ntohl的时候/在哪里以及多少次?
另外,我是否必须为字符串/字符数组执行ntohl / htonl?字符是否必须转换?
答案 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)。