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

时间:2013-10-25 22:00:23

标签: c networking tcp

我想知道在发送两个整体或字节数组时是否有任何跳闸或跌落。

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

2 个答案:

答案 0 :(得分:1)

您需要牢记的主要事项是endianness。也就是说,解释字节的顺序在不同平台上是不同的。

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

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

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

答案 1 :(得分:0)

此外,您显然希望使用单个套接字写操作发送两个字节。不要写一个字节,然后使用两次写入写另一个字节,因为这可能最终导致电线效率非常低。也就是说,不要写uint8_t [0],然后写uint8_t [1]。写作& uint16_t将避免这种情况。