Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets htonl、NTHOL、NBO客户端和服务器_Sockets_Networking_Byte_Winsock - Fatal编程技术网

Sockets htonl、NTHOL、NBO客户端和服务器

Sockets htonl、NTHOL、NBO客户端和服务器,sockets,networking,byte,winsock,Sockets,Networking,Byte,Winsock,我正在编写服务器和客户端,我需要传递一些整数 在我的服务器应用程序中,我从客户端接收到一个整数 在客户端中,我对整数调用ntohl还是htonl? 如果我调用其中任何一个,当我收到整数时,我必须再次调用ntohl或htonl吗?或者我只在服务器端调用ntohl/htonl,而不在客户端调用 换句话说,对于每个整数,何时/何地以及使用htonl或ntohl的次数是多少 另外,我是否必须对字符串/字符数组执行ntohl/htonl?是否必须转换字符?此场景中的典型设置是在客户端调用htonl(因为您

我正在编写服务器和客户端,我需要传递一些整数

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

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

换句话说,对于每个整数,何时/何地以及使用htonl或ntohl的次数是多少


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

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


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

发送整数时,始终调用
hton…()
以确保字节从发送机器的本机字节顺序转换为网络字节顺序

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

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

在客户端中,我对整数调用ntohl还是htonl

这与您是客户机还是服务器无关。这与你是发送还是接收有关。如果要发送,则需要网络字节顺序,因此调用
htonl
()。如果您正在接收,则需要主机订单,因此可以调用
ntohl()。

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

对。发送方应已将数据放入网络字节顺序;接收者必须将其放入本地主机的主机顺序中

换句话说,对于每个整数,何时/何地以及使用htonl或ntohl的次数是多少


htonl()
发送时
ntohl()
接收时。

对于字符串,只有UTF-16/32编码受字节顺序的影响,因为它们都使用多字节编码单元。其他UTF编码和所有ANSI/ISO编码都使用单字节编码单元。
hton…
ntoh…
函数可用于UTF-16/32数据,只需按代码单位调用它们即可。只有在将UTF-16/32 LittleEndian转换为UTF-16/32 BigEndian时,以及将UTF-16/32 BigEndian转换为UTF-16/32 BigEndian和UTF-16/32 BigEndian转换为UTF-16/32 BigEndian时,才需要使用此选项。@Remylebe。关于UTF-16/32字符串的观点很好,尽管这种情况也可以通过在字符串前面加一个字节顺序标记来处理。它与客户端和服务器无关,只与发送和接收有关。@EJP是正确的,但我是在原始问题的上下文中解释的,其中客户端是发送方,服务器是接收方。