决定htons和htonl

时间:2017-01-07 07:30:13

标签: c sockets network-programming

我已阅读this explanationthis manual page关于htonshtonlntohlntohs的使用情况,但我仍然没有完全理解它们的用法(我对socket API和网络编程很新)。我确实理解小和大的Endian和字节顺序,但我不确定如何在我的聊天应用程序代码中正确实现这些函数,因此它在不同的机器上一致地工作(其中一个使用大En​​dian而另一个使用很少)。

我的具体情况的一点背景;我有一个(几乎)完全正常工作的聊天应用程序,刚刚使用htons,但经过一些研究后,这似乎是不可靠的。我意识到this question可能看起来非常相似,但是我在这里询问一个实现示例,我已经知道这些调用的基本功能。

2 个答案:

答案 0 :(得分:2)

这个想法对于整数类型有一些共同的表示。 TCP / IP使用NBO,即网络字节排序。无论它是什么(大端或小端或更奇特),发送16位整数或32位的方式是在发送这样的数据之前使用htonshtonl。接收后,您必须使用ntohsntohl将其转换回主持人代表:

发件人希望发送值uint32_t a,然后发送htonl(a)返回的数据,比如d。

接收方获取d,应用ntohl(d)并获得正确的uint32_t值。

这些只是编码/解码功能。发送者发送代码(v),然后接收者得到解码(代码(v))!你不必知道代码(v)等于(没兴趣)。

如果您觉得不可靠,那是因为您没有按原样使用它。

答案 1 :(得分:0)

如果您在两台计算机之间的网络上发送数据,接收方必须解释数据,以便解释的值与发送方的值相同。

假设发件人从一个小端机器上发送了一个4字节的长字,接收者的机器是大端的。在这种情况下,接收器可以按其他顺序解释4个字节。

通过将网络视为大端,函数HtoNxNtoHx有助于使传输统一。对于每种基本数据类型,x可以采用不同的值,表示数据的大小。因此,发件人从他的机器发送HtoNl(主机到网络LONG),此功能将数据转换为netword解释(即大端)。接收器将执行NtoHl(网络到主机LONG),此功能将从网络解释转换为他自己的机器解释(如果他自己的机器也是大端,NtoHl是身份功能)。 / p>