gpt4 book ai didi

c - 缓冲区未正确读取字符串

转载 作者:行者123 更新时间:2023-11-30 17:33:17 25 4
gpt4 key购买 nike

void download(char *file)
{
int size = getsize(file);
printf("Got size %d\n", size);
sprintf(buff, "GET %s\n", file);
send(sockfd, buff, strlen(buff), 0);
rsize = recv(sockfd, buff, 1000, 0);
sscanf(buff, "%d", &resultcode);
printf("%s", buff);
if (strcmp(buff, "+OK\n") != 0)
{
printf("download failed\n");
}
FILE *dlfile = NULL;
if ((dlfile = fopen(file, "r")) != NULL)
{
dlfile = fopen(file, "w");
do
{
rsize = recv(sockfd, buff, 1000, 0);
for (int i = 0; i < rsize; i++)
{
fprintf(dlfile, "%c", buff[i]);
}
size = size - rsize;
} while (size != 0);
}
fclose(dlfile);
}

我试图让下载功能打印出用户输入的文件内容,然后将其保存到当前目录。我做了一个调试行 printf("%s", buff); 并打印出 +OK\n(filename)。它应该打印出+OK\n。它还打印出下载失败,然后打印段错误错误。我缺少什么?

最佳答案

这里发生了几件事。首先,recv 和 send 基本上对字节数组进行操作,因此它们不知道行结尾等。另请注意,recv 不能保证填充缓冲区 - 它通常会读取缓冲区限制内可用的内容。对于针对“+OK\n”的 strcmp,您可以使用长度为 4 的 strncmp,但这有点直接(见下文)。接下来请注意,buff 字符串不是由recv 终止的,因此您的printf 很容易崩溃。

当您进入循环时,缓冲区中已经包含了其余 I/O 的一部分。可能包含文件的其他字段或部分。你也需要处理它。我不清楚 getsize 的作用 - 但使用该大小来驱动循环似乎不合适。此外,对 fprintf 值的循环可以通过调用 fwrite 来替换。

总的来说,您需要正确缓冲然后解析传入的数据流。如果你想自己做,你可以查看 fdopen 来获取 FILE 对象。

关于c - 缓冲区未正确读取字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23798368/

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