【发布时间】:2017-03-12 23:32:15
【问题描述】:
我正在尝试接收 TCP 套接字的消息并将其存储在 uint8_t 数组中。
我要接收的缓冲区长度为 8 个字节,包含 4 个唯一值。
字节 1:值 1,即 uint8_t,字节 2-3:值 2,即 uint16_t,字节 4:值 3,即 uint8_t,字节 5-8:值 4,即无符号长整数。
Endianness 是大端顺序。
int numBytes = 0;
uint8_t buff [8];
if ((numBytes = recv(sockfd, buff, 8, 0)) == -1)
{
perror("recv");
exit(1);
}
uint8_t *pt = buff;
printf("buff[0] = %u\n", *pt);
++pt;
printf("buff[1] = %u\n", *(uint16_t*)pt);
但是第二个printf 打印出一个意外的值。我是否做了错误的事情来提取这两个字节,或者我的打印功能有问题?
【问题讨论】:
-
在您解释“字节 2-3:值 2”的含义之前无法回答,即这些字节应如何转换为值。值 4 相同。
-
我们不知道多字节值的字节顺序,但我认为通过使用指针而不是直接将
buff索引为数组来使问题复杂化没有任何目的,并逐个元素提取值。 -
@PeteBecker 对我来说似乎很清楚:值 2 表示第二个值。
-
@WeatherVane - 嗯?当然 value2 表示第二个值。您在回复之前阅读我的评论吗?
-
关于 TCP 的重要说明:它是基于流的,而不是基于消息的。永远不要仅仅因为
recv没有返回错误就认为您收到了整个消息。recv返回它可用的内容最多您要求的字节数。在这种情况下,recv可以返回 0(礼貌地关闭套接字)、1 或 2。如果您需要 N 个字节,则可能必须循环recv,直到收到 N 个字节。