当我通过套接字将一个整数变量从一个进程发送到另一个进程,然后在接收端打印该值时,如果不使用ntohl / htonl,该值仍然相同,那么除了初始化之外我还需要使用这些函数插座结构。我理解litte / big endian。但是,当值保持不变时,为什么我们需要将端口和IP nos转换为主机/网络字节顺序。请详细说明整数是如何通过网络传输的?
答案 0 :(得分:16)
如果您希望程序可移植,那么每次通过网络发送大小超过1个字节的整数时,必须先使用htons
或htonl
将其转换为网络字节顺序,接收计算机必须使用ntohs
或ntohl
将其转换为主机字节顺序。
在您的情况下,值仍然相同的原因可能是因为发送计算机和接收计算机具有相同的字节顺序。换句话说,您正在使用的发送计算机和接收计算机都是小端(或大端,无论情况如何)。
但是如果你希望你的程序是可移植的,你不能总是依赖它。例如,有一天,发送计算机可能是Intel x86,接收可能是Sun SPARC,如果您不使用htons
,则程序将失败。
答案 1 :(得分:9)
如果您想将数据从x86或amd64机器发送到带有PowerPC处理器的机器,以二进制格式,您很快就会发现您的数据遇到了“NUXI问题”处理器以不同方式处理整数,并且似乎交换字节。 (它们实际上并不交换字节 - 它们只是以不同的顺序使用它们。)
在处理x86或amd64时,最不重要的字节首先出现在内存中(这样您就可以从较低内存地址执行添加更高内存地址)。 PowerPC将最重要的字节放在内存中(这样您就可以根据内存中较早的字节对数字进行排序 - 字符串排序和整数排序可以完全相同。)
答案 2 :(得分:0)
它重新保存相同,因为在您的体系结构中,网络顺序与本机顺序相同。如果您从未预料到为另一个体系结构编译代码,则可以省略hton / ntoh调用。您的代码将无法移植。