繁体   English   中英

C套接字读取太多数据

[英]C Socket Reading TOO MUCH Data

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

请求的形式为<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);

调用readvalread保留您读取的字节数,并且这是唯一保留此信息的东西。 但是,您尝试不使用该值就将读取的数据追加到现有缓冲区上-因此, strcat不可能想像知道要向缓冲区追加多少字节。 难怪您会添加之前阅读的垃圾内容。

这里有类似的问题:

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

在这里,您将忽略read的返回值,因此无法知道要读取的字节数。 您如何期望strlen找出read入缓冲区的字节数?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM