0

我正在尝试新的 C++ 套接字编程。我在理解 htons、htonl 和相关函数的功能时遇到了一些困难。我阅读了一些文件,但我的问题仍然如下,

对于单个服务器和单个客户端,我在两端都使用 htons 作为端口号,并且代码工作正常。即使我不使用这些功能并且我的两个服务器客户端都是基于 Intel 的 64 位机器,代码也可以正常工作。但是如果多个客户端尝试连接我的服务器并且客户端使用不同的数据存储格式怎么办。例如,x86 是 little-endian,而 ARM A-53 是 little-endian 和 big-endian 等,其中一些是 32 位、16 位或 64 位等。我的服务器是 64 位。所以我现在很困惑我必须使用哪些功能统一服务于所有目的?或者,我必须始终检测客户端类型并将其数据格式(端口号)转换为 64 位(因为我的服务器是 64 位),然后使用 htonl() 函数到达服务器。

4

2 回答 2

4

这些函数从网络字节顺序转换为网络字节顺序(实际上是大端)。无论您正在编程的架构是否会执行该任务(如果您使用的是大端架构,那将只是一个空操作)。

因此,使用这些将使代码可移植。请注意,您不应htonl在两种转换中都使用。当您将数据发送到另一台主机时,您在发送数据htonl之前使用(主机到网络字节顺序),然​​后ntohl在接收时使用(网络到主机字节顺序)。

请注意,ntohlhtonl不能保证(尽管我不能举一个例子)是相同的,因此您应该使用正确的。

于 2015-10-27T11:42:17.270 回答
2

你问这个问题很好。这表明你在担心正确的事情。

此处的文档:

http://linux.die.net/man/3/htonl

请注意,无论您在哪个系统上,参数和返回类型都有特定的大小。

于 2015-10-27T11:40:14.613 回答