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