【问题标题】:Does any uniform function exists instead of htons htonl是否存在任何统一函数而不是 htons htonl
【发布时间】:2015-10-27 11:22:53
【问题描述】:

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

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

【问题讨论】:

标签: c++ c sockets htonl


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    这里的文档:

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

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

    【讨论】:

    • 嗨,理查德...感谢您的回复。但是,我仍然有困惑。你能详细说明一下吗?我从您的回答中了解到一件事,我不需要将数据转换为 64/32/16 位,因为您说参数和返回类型具有特定的大小。在那种情况下,我仍然有疑问我是否必须检测每个客户端,以便我可以决定为谁使用 htons/htonl(参数)或 ntohs/ntohl(返回类型)?
    • 对于系统间通信,使用固定大小很重要。除非您有充分的理由使用大型数据类型,否则 32 位和 16 位类型就足够了。在这种情况下, htonl 和 htons (以及它们的反向形式)就足够了。如果您需要移动 64 位数字、浮点数或字符串,那么您需要一个更正式的协议。一种这样的协议是 google 的协议缓冲区,它不仅是跨平台的,而且是跨语言的。看看这里:developers.google.com/protocol-buffers
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    相关资源
    最近更新 更多