混乱的htons-小端/大端

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

如果您希望程序是可移植的,那么每次通过网络发送大小超过1个字节的整数时,必须先使用htonshtonl将其转换为网络字节顺序,并且接收计算机必须将其转换为主机字节使用ntohsntohl订购。

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

但是如果你希望你的程序是可移植的,你不能总是依赖于这个。 例如,有一天,发送计算机可能是Intel x86,接收可能是Sun SPARC,如果不使用htons程序将失败。

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

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

它重新保留了相同的结果,因为在您的体系结构中,网络顺序与本机顺序相同。 如果您从未预料到为另一个体系结构编译代码,则可以省略hton / ntoh调用。 您的代码将无法移植。