【问题标题】:htonl, ntohl, NBO client and serverhtonl、ntohl、NBO 客户端和服务器
【发布时间】:2013-05-18 02:15:38
【问题描述】:

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

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

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

换句话说,我何时/何地以及多少次使用 htonl 或 ntohl 来处理每个整数?

另外,我必须为字符串/字符数组执行 ntohl/htonl 吗?字符必须转换吗?

【问题讨论】:

    标签: sockets networking byte winsock


    【解决方案1】:

    在客户端我是在整数上调用 ntohl 还是 htonl?

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

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

    是的。发送者应该已经将数据按网络字节顺序排列;接收者必须为他的本地主机将其放入主机顺序中。

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        这种情况下的典型设置是在客户端调用 htonl(因为您想将整数放入 networkprotocol 顺序)和 @987654322 @ 在服务器中(因为你想从网络转换回 host 顺序)。

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

        【讨论】:

        • 对于字符串,只有 UTF-16/32 编码受字节顺序影响,因为它们都使用多字节代码单元。其他 UTF 编码和所有 ANSI/ISO 编码都使用单字节代码单元。 hton...ntoh... 函数可用于 UTF-16/32 数据,只需在每个代码单元的基础上调用它们。只有在将 UTF-16/32 LittleEndian 转换为 UTF-16/32 BigEndian 时才需要这样做,反之亦然。
        • @RemyLebeau。关于 UTF-16/32 字符串的好点,尽管这种情况也可以通过在字符串前面加上字节顺序标记来处理。
        • 它与客户端和服务器无关,只与发送和接收有关。
        • @EJP 没错,但我是在原始问题的上下文中解释的,客户端是发送者,服务器是接收者。
        猜你喜欢
        • 2016-08-23
        • 2013-03-29
        • 2014-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多