gpt4 book ai didi

C 套接字将数据附加到缓冲区被损坏

转载 作者:太空宇宙 更新时间:2023-11-04 08:55:44 25 4
gpt4 key购买 nike

我仍在完善我的 C 编码技能,并不断遇到有关正确管理内存的问题 - 算了吧。无论如何,我正在从一个套接字读取数据,只要我从套接字发出的总响应长度不超过我的缓冲区大小,我就可以了。我知道这一点是因为当我将缓冲区大小时增加到足以容纳传入数据时,它对于较大的有效负载也能正常工作。显然,在堆栈上创建一个非常大的“以防万一”缓冲区是不可行的,所以我想在堆上动态地增加缓冲区。这是我目前正在做的事情:

raw_response = NULL;

// Receive from the Web server
retcode = recv(server_s, in_buf, BUF_SIZE, 0);

while ((retcode > 0) || (retcode == -1))
{
totalLength += retcode;

if (raw_response == NULL) {
raw_response = (char*)malloc(sizeof(char)*totalLength);
memcpy(raw_response, in_buf, totalLength);
} else {
raw_response = (char*)realloc(raw_response, sizeof(char)*totalLength);
memcpy(raw_response+previousLength, in_buf, retcode);
}

previousLength = retcode;
retcode = recv(server_s, in_buf, BUF_SIZE, 0);
if (retcode == 0 || retcode == -1) {
printf("\n\nNo more data, bailing. Data length was: %lu\n\n", totalLength);
}
}

如果 raw_response 为 NULL,我知道我还没有收到任何数据,所以我使用 malloc。否则,我使用 realloc 这样我就不必建立新的缓冲区。相反,我可以只附加传入的数据。因此,为了在第一次迭代后获取现有数据的结尾,我获取 raw_response 的地址并将之前的长度添加到该地址,并在其中附加新数据,假设它在每次后续调用 recv() 时都正确附加。

问题是我的最终缓冲区总是损坏,除非我将 BUF_SIZE 更改为大于我的总传入数据大小的值。

看起来这可能只是我忽略的一些简单的事情。有什么想法吗?

最佳答案

问题是这些行:

memcpy(raw_response+previousLength, in_buf, retcode);
previousLength = retcode;

您的函数将适用于第一次和第二次迭代,但之后将开始破坏数据。我假设您打算编写 previousLength += retcode;

代码还有一些其他问题,无法回答您的问题。首先,如果 realloc 或 malloc 失败会怎样?你不会在你的小样本中检查这个。此外,您始终可以只使用 realloc(如果指针为 NULL,它将像 malloc 一样运行,请参阅 this SO 问题)。即

char *tmp = realloc(raw_response, sizeof(*tmp) * totalLength);
if (tmp == NULL)
return -ENOMEM;
raw_response = tmp;
memcpy(raw_response + previousLength, in_buf, ret_code)

其次,您可能会在 ret_code 为 -1 时调用 memcpy(同时将 totalLength 更改为 -1,这将再次导致问题)。

关于C 套接字将数据附加到缓冲区被损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17198501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com