是否存在任何统一函数而不是htons htonl

时间:2015-10-27 11:22:54

标签: c++ c sockets htonl

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

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

2 个答案:

答案 0 :(得分:4)

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

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

请注意ntohlhtonl不保证(尽管我无法举例说明)是相同的,因此您应该使用正确的。{/ p>

答案 1 :(得分:2)

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

此处的文档:

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

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