我想知道是否有关于发送两个字节作为一个整体或一个字节数组的任何绊倒或下降。
说我要发送uint16_t
。发送两个字节的数组uint8_t[2]
还是一次只发送 16 位更好?
我想知道是否有关于发送两个字节作为一个整体或一个字节数组的任何绊倒或下降。
说我要发送uint16_t
。发送两个字节的数组uint8_t[2]
还是一次只发送 16 位更好?
您需要记住的主要事情是字节顺序。也就是说,字节的解释顺序在不同的平台上是不同的。
例如,您的 Intel CPU 可能会将字节字符串解释0x01 0x00
为数字 1,但其他人的 PowerPC 会将字节字符串解释为数字 256。
在构建网络协议时,记住这样的问题很重要。(您可能会查看Google Protocol Buffers 之类的东西,它旨在解决这个问题)
由于您只谈论两个字节,因此您还应该查看htons()
宏。这会将 2 字节值从host order转换为network order。(网络顺序是big endian,而主机顺序通常是little endian,但在 big endian 平台上htons()
可以简单地定义为无操作。)如果要发送 4 字节(32 位)值,还应该采用看看htonl()
宏。htons
代表host to network short,并将您的 16 字节值转换为等效的网络顺序16 位值(如果您在 Intel CPU 上,这意味着它将返回 16 位整数的一个版本,其中字节交换了)。当您有传入字节时,您的代码应使用ntohs
(和ntohl
,对于 32 位值)宏将传入数据从网络字节顺序转换回主机顺序。
此外,您显然希望使用单个套接字写入操作发送两个字节。不要写入一个字节,然后使用两次写入来写入另一个字节,因为这最终可能会导致网络效率非常低下。也就是说,不要写 uint8_t[0] 后跟 uint8_t[1]。写 &uint16_t 可以避免这种情况。