c - 使用 TCP 在 C 中发送两个字节

标签 c networking tcp

我想知道发送两个字节作为一个整体或一个字节数组是否有任何绊倒或跌倒。

假设我要发送 uint16_t。像 uint8_t[2] 这样发送两个字节的数组还是一次只发送 16 位更好?

最佳答案

你需要记住的主要事情是endianness .也就是说,字节被解释的顺序在不同的平台上是不同的。

例如,您的 Intel CPU 可能会将字节字符串 0x01 0x00 解释为数字 1,但其他人的 PowerPC 会将该字节字符串解释为数字 256。

在构建网络协议(protocol)时,牢记此类问题非常重要。 (您可能会看到像 Google Protocol Buffers 这样的东西,它旨在解决这个问题)

由于您只讨论两个字节,因此您还应该看一下 htons() 宏。这会将一个 2 字节的值从主机顺序 转换为网络顺序。 (网络顺序是 big endian,而主机顺序通常是 little endian,但在 big endian 平台上 htons() 可以简单地定义为无操作。)如果你想发送 4 字节(32 位)值,你还应该看看 htonl() 宏。 htons 代表主机到网络短,并将您的 16 字节值转换为等效的 网络顺序 16 位值(如果您是在 Intel CPU 上,这意味着它将返回一个版本的 16 位整数,并交换了字节)。当您有传入字节时,您的代码应使用 ntohs(和 ntohl,用于 32 位值)宏将传入数据从网络字节顺序转换回主机顺序.

关于c - 使用 TCP 在 C 中发送两个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19600117/

相关文章:

MPI_Group 中排名的自定义排序

c - 用C编写二进制文件

c - 为什么 C 代码不返回结构?

iphone - EXC_BAD_ACCESS 访问 NSMutableData

Python 套接字 - 从客户端保持与服务器的连接

使用 C unix 命令或 C 更改文件中的特定单词

java - Pcap4j TCP 数据包在 Wireshark 上显示后被丢弃

Java - 服务器网络特定的客户端聊天

Java 套接字 : DataOutputStream or OutputStream?

c - 使用 sock_stream 时连续调用 write 是否安全?