2009-11-05 76 views
9

当我发送一个整数变量从一个进程到其他通过套接字,然后打印接收端的值,该值仍然是相同的,而不使用ntohl/htonl,然后在哪里做我需要使用这些函数,而不是初始化套接字结构。我明白litte/big endian。但是,当值保持不变时,为什么我们需要将端口和IP nos转换为主机/网络字节顺序。请详细解释整数如何通过网络传输?混乱htons-小端/大端

回答

16

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

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

但是,如果你希望你的程序是可移植的,你不能依靠这种情况总是如此。例如,有一天,发送计算机可能是Intel x86,接收方可能是Sun SPARC,如果您不使用htons,则程序将失败。

+0

我写了客户端和服务器,并没有使用htonl和ntohl。说我送6时,服务器收到6个值。那么这些功能的需求是什么? – avd 2009-11-05 05:23:43

+5

这些功能的需求是在客户端运行在小端计算机上,而服务器运行在大端时,或反之亦然。 – 2009-11-05 05:26:09

+0

非整数数据类型如结构体怎么样?他们有没有头绪? – 2014-02-24 05:13:51

9

如果您想要将数据从x86或amd64机器发送到使用PowerPC处理器的机器,采用二进制格式,您将很快看到数据遇到“NUXI问题”,因为不同的处理器处理整数不同并且似乎交换字节。 (它们实际上不交换字节 - 它们只是以不同的顺序与它们一起工作)。

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

0

它重新生成因为在您的体系结构中,网络顺序与本机顺序相同。如果你从不期望为另一个架构编译你的代码,你可以省略hton/ntoh调用。那么你的代码将不可移植。

+1

这是不正确的。他可能会使用主机订单与网络订单不同的架构。只要两个端点的体系结构具有相同的端点,您的代码就可以在没有htonX/ntohX的情况下“运行”。 – 2009-11-05 06:39:33

+0

你是对的 - 我打算说这样的话,但我的回答并不是很清楚。 – 2009-11-05 16:03:22