c - 在 htons 和 htonl 之间做出选择

标签 c sockets network-programming

我已阅读 this explanationthis manual page关于htonshtonlntohlntohs的用法,但是我还是不太明白它们的用法(一般来说,我对套接字 API 和网络编程还很陌生)。我确实了解大小 Endian 和字节顺序,但我不确定如何在我的聊天应用程序代码中正确实现这些功能,以便它在不同的机器上一致地工作(一个使用大 Endian,另一个使用小 Endian)。

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

最佳答案

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

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/

相关文章:

iPhone流式编程(CFStream) Hello World

python - 无法使用 OpenSSL 的 ssl.SSLContext() 在 Python 客户端中接收对等证书

c - Emacs -*- lang -* 标签和旧式 K&R C

c - 本地调用静态变量是否正确?

c - sscanf 的段错误

java - 为什么 Java DatagramSocket 在确定连接时在 "isConnected"上返回 false?

c - 在c中通过套接字发送图像文件时出现问题

c - 最快的位计数方法

sockets - Vue.JS + Socket.IO和Cloudflare

c# - 使用特定方法套接字服务器调用