我已阅读this explanation和this manual page关于htons
,htonl
,ntohl
和ntohs
的使用情况,但我仍然没有完全理解它们的用法(我对socket API和网络编程很新)。我确实理解小和大的Endian和字节顺序,但我不确定如何在我的聊天应用程序代码中正确实现这些函数,因此它在不同的机器上一致地工作(其中一个使用大Endian而另一个使用很少)。
我的具体情况的一点背景;我有一个(几乎)完全正常工作的聊天应用程序,刚刚使用htons
,但经过一些研究后,这似乎是不可靠的。我意识到this question可能看起来非常相似,但是我在这里询问一个实现示例,我已经知道这些调用的基本功能。
答案 0 :(得分:2)
这个想法对于整数类型有一些共同的表示。 TCP / IP使用NBO,即网络字节排序。无论它是什么(大端或小端或更奇特),发送16位整数或32位的方式是在发送这样的数据之前使用htons
或htonl
。接收后,您必须使用ntohs
和ntohl
将其转换回主持人代表:
发件人希望发送值uint32_t a
,然后发送htonl(a)
返回的数据,比如d。
接收方获取d
,应用ntohl(d)
并获得正确的uint32_t
值。
这些只是编码/解码功能。发送者发送代码(v),然后接收者得到解码(代码(v))!你不必知道代码(v)等于(没兴趣)。
如果您觉得不可靠,那是因为您没有按原样使用它。
答案 1 :(得分:0)
如果您在两台计算机之间的网络上发送数据,接收方必须解释数据,以便解释的值与发送方的值相同。
假设发件人从一个小端机器上发送了一个4字节的长字,接收者的机器是大端的。在这种情况下,接收器可以按其他顺序解释4个字节。
通过将网络视为大端,函数HtoNx
和NtoHx
有助于使传输统一。对于每种基本数据类型,x
可以采用不同的值,表示数据的大小。因此,发件人从他的机器发送HtoNl
(主机到网络LONG),此功能将数据转换为netword解释(即大端)。接收器将执行NtoHl
(网络到主机LONG),此功能将从网络解释转换为他自己的机器解释(如果他自己的机器也是大端,NtoHl
是身份功能)。 / p>