【发布时间】:2020-09-16 12:57:40
【问题描述】:
我想从 A 侧发送具有正文大小的正文和标头。 在 B 面,在第一个 recv() 标头中确定有效负载的大小。第二个,recv() 主体。
我尝试使用 recv() 两次,但无法通过第二个 recv() 函数。
A面
struct CommandHeader_t {
int BodySizeByte;
};
void Send()
{
const int BODY_SIZE_BYTE = 10;
CommandHeader_t* header_ptr = (CommandHeader_t*) malloc(sizeof(CommandHeader_t) + BODY_SIZE_BYTE);
header_ptr->BodySizeByte = BODY_SIZE_BYTE;
char* body_ptr = (char*) (header_ptr + sizeof(CommandHeader_t));
snprintf(body_ptr, BODY_SIZE_BYTE, "Hello World");
int sock = socket(AF_LOCAL, SOCK_DGRAM, 0);
struct sockaddr_un addr = {0};
addr.sun_family = AF_LOCAL;
strcpy(addr.sun_path, SENDING_SOCKET);
sendto(sock, header_ptr, sizeof(CommandHeader_t) + BODY_SIZE_BYTE, 0, (const struct sockaddr*)&addr, sizeof(addr));
close(sock);
}
B面
void Reveice()
{
// something
CommandHeader_t header;
char* body_ptr;
recv(sockfd, &header, sizeof(CommandHeader_t), 0);
body_ptr = (char*) malloc(header.BodySizeByte);
recv(sockfd, body_ptr, header.BodySizeByte, 0); // CANNOT recv anything
}
【问题讨论】:
-
看起来您发送了一个带有标题和内容的数据报。接收方收到了数据报,但是
recv()只表示了报头的大小。因此,数据报的其余部分被丢弃并丢弃。因此,在第二次接收中,没有汤适合你。 -
建议:不要忽略返回码。它们几乎总是包含重要信息,例如“我真正得到了多少字节的数据?”或“我得到什么了吗?”以及曾经流行的“嘿,我的插座还活着吗?”。
-
由于这是 UDP,您甚至没有提及,因此无需发送有效负载大小。
recv()的返回值已经提供了。