9

当我通过套接字从一个进程向另一个进程发送一个整数变量,然后在接收端打印该值时,不使用ntohl/htonl,该值仍然相同,那么除了初始化套接字结构之外,我还需要在哪里使用这些函数。我理解小/大端。但是为什么我们需要在值保持不变的情况下将端口和 IP 号转换为主机/网络字节顺序。请详细解释整数是如何通过网络传输的?

4

3 回答 3

16

如果您希望您的程序是可移植的,那么每当您通过网络发送一个大于 1 字节的整数时,您必须首先使用htonsor将其转换为网络字节顺序htonl,并且接收计算机必须使用将其转换为主机字节顺序ntohsntohl

在您的情况下,值仍然相同的原因可能是因为发送计算机和接收计算机具有相同的字节序。换句话说,您正在使用的发送计算机和接收计算机都是小端(或大端,无论情况如何)。

但是,如果您希望您的程序具有可移植性,则不能始终如此。比如有一天,发送计算机可能是 Intel x86,接收计算机可能是 Sun SPARC,然后如果您不使用htons.

于 2009-11-05T05:21:57.173 回答
9

如果您想将数据从 x86 或 amd64 机器发送到具有 PowerPC 处理器的机器,以二进制格式,您将很快看到您的数据遇到“NUXI 问题”,因为不同的处理器以不同的方式处理整数并似乎交换了字节。(它们实际上并不交换字节——它们只是以不同的顺序使用它们。)

在 x86 或 amd64 上工作时,最低有效字节首先出现在内存中(这样您可以执行从低到高内存地址的加法)。PowerPC 将最重要的字节放在内存的最前面(这样您可以根据内存中较早出现的字节对数字进行排序——字符串排序和整数排序可以完全相同。)

于 2009-11-05T05:22:09.060 回答
0

它保持不变,因为在您的架构上,网络顺序与本机顺序相同。如果您从未期望为其他架构编译您的代码,您可以省略 hton/ntoh 调用。您的代码将无法移植。

于 2009-11-05T05:22:53.350 回答