我已阅读 this explanation和 this manual page关于htons
、htonl
、ntohl
和ntohs
的用法,但是我还是不太明白它们的用法(一般来说,我对套接字 API 和网络编程还很陌生)。我确实了解大小 Endian 和字节顺序,但我不确定如何在我的聊天应用程序代码中正确实现这些功能,以便它在不同的机器上一致地工作(一个使用大 Endian,另一个使用小 Endian)。
我的具体情况的一些背景信息;我有一个(几乎)完全可用的聊天应用程序,并且一直在使用 htons
,但经过一些研究后,这似乎是不可靠的。我意识到 this question可能看起来很相似,但是在这里我问的是一个实现示例,我已经知道这些调用的基本功能。
最佳答案
这个想法是对整数类型有一些通用的表示。 TCP/IP 使用 NBO,网络字节排序。无论它是什么(大端或小端或更奇特的)发送 16 位整数或 32 位整数的方式是在发送这样的数据。然后在接收时,您必须使用 ntohs
和 ntohl
将其转换回您的主机表示:
Sender要发送值uint32_t a
,然后发送htonl(a)
返回的数据,比如d。
接收方获取 d
,应用 ntohl(d)
并获得正确的 uint32_t
值。
这些只是编码/解码 函数。发送方发送代码(v),然后接收方得到解码(代码(v))!您不必知道 code(v) 等于什么(没兴趣)。
如果您觉得它不可靠,那是因为您没有按应有的方式使用它。
关于c - 在 htons 和 htonl 之间做出选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41519018/