gpt4 book ai didi

C 套接字读取太多数据

转载 作者:太空宇宙 更新时间:2023-11-04 07:51:47 26 4
gpt4 key购买 nike

我正在制作一个应该能够接受来自多个客户端的请求的服务器。为确保我能正确读取大量请求,我编写了以下代码段。

请求以 <START_REQUEST>a long message<END_REQUEST> 的形式出现

read(fd, buffer, BUFFER_SIZE);
// Keep Reading If Entire Message Not Recieved
int buffer_len = strlen(buffer);
char *end_tag = &buffer[buffer_len-strlen("<END_REQUEST>")];
while(strcmp(end_tag, "<END_REQUEST>") != 0) {

char *temp_buffer;
temp_buffer = malloc(BUFFER_SIZE);

valread = read(fd, temp_buffer, BUFFER_SIZE);
strcat(buffer, temp_buffer);

free(temp_buffer);

buffer_len = strlen(buffer);
end_tag = &buffer[buffer_len-strlen("<END_REQUEST>")];
}

但是,有时(经常)缓冲区的内容类似于: <START_REQUEST>a long message<END_REQUEST>somegarbagedataheremaybefromanotherequest?因此循环永远不会终止。

为什么会这样?

最佳答案

您如何期望 strcat 知道要将多少字节附加到缓冲区?

valread = read(fd, temp_buffer, BUFFER_SIZE);
strcat(buffer, temp_buffer);

在调用 read 之后,valread 会保存您读取的字节数,并且它是唯一保存该信息的东西。但是,您尝试在不使用此值的情况下将读取的数据追加到现有缓冲区中——因此 strcat 不可能知道要将多少字节追加到缓冲区中。难怪您会附加以前阅读过的垃圾内容。

这里有类似的问题:

read(fd, buffer, BUFFER_SIZE);
// Keep Reading If Entire Message Not Recieved
int buffer_len = strlen(buffer);

这里你忽略了read的返回值,所以你无从知道你读了多少字节。您如何期望 strlen 计算出有多少字节 read 放入缓冲区?

关于C 套接字读取太多数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53328376/

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