当我通过套接字从一个进程向另一个进程发送一个整数变量,然后在接收端打印该值时,在不使用ntohl/htonl的情况下,该值仍然是相同的,那么除了初始化套接字结构外,我还需要在哪里使用这些函数。我了解小字/大尾数法。但是为什么在值保持不变的情况下为什么需要将端口号和IP号转换为主机/网络字节顺序。请详细说明如何通过网络传输整数?
最佳答案
如果要使程序具有可移植性,则每次通过网络发送大小大于1个字节的整数时,必须首先使用htons
或htonl
将其转换为网络字节顺序,并且接收计算机必须将其转换为主机字节使用ntohs
或ntohl
进行订购。
在您的情况下,该值仍相同的原因可能是因为发送方计算机和接收方计算机的字节序相同。换句话说,您正在使用的发送计算机和接收计算机都是小字节序(或大字节序,无论如何)。
但是,如果您希望程序具有可移植性,则不能总是这样。例如,有一天,发送方的计算机可能是Intel x86,接收方的计算机可能是Sun SPARC,如果您不使用htons
,则程序将失败。
关于千吨困惑-小端/大端,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1678490/