当我通过套接字发送整数变量从一个过程到其它,然后在接收端进行打印的值,该值仍然是相同的,而无需使用再用ntohl / htonl,然后我在哪里需要使用不是初始化其他这些功能插座的结构。我明白豆蔻/大端。但是,为什么我们需要转换端口和IP号到主机/网络字节顺序当值保持不变。请详细解释的整数是如何tranferred通过网络?

有帮助吗?

解决方案

如果你希望你的程序可以移植,那么任何时候你的规模在网络上发送一个整数大于1个字节,必须首先将其转换使用htonshtonl网络字节顺序,并接收计算机必须将其转换使用ntohsntohl为主机字节顺序。

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

但如果你想你的程序是便携式的,你不能靠这个来始终如此。有一天,例如,发送计算机可能是英特尔的x86和接收可在Sun SPARC,然后你的程序将失败,如果你不使用htons

其他提示

如果您想从x86或AMD64机器的数据发送到一台机器PowerPC处理器,在格式,你很快就会看到你的数据遇到“NUXI问题”为不同处理器区别对待的整数,似乎交换字节。 (他们实际上不交换字节 - 他们只是与他们不同的顺序工作)

在x86或AMD64工作时,至少-显著字节首先出现存储器(这种方式可以从低级到高级的存储器地址执行加法)。 PowerPC的首先将其最显著字节存储器(这种方式,您可以根据在内存中提前到来的字节数排序 - 一个字符串排序和整数排序可能是完全一样的)

有remaimns因为你的体系结构相同的网络顺序是一样的天然顺序。如果你从来没有预料编译代码为另一种架构,你可以省略hton / NTOH电话。然后您的代码将不便携的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top