C套接字读取太多数据

时间:2018-11-15 21:50:03

标签: c sockets

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

请求以<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? 因此循环永远不会终止。

为什么会这样?

1 个答案:

答案 0 :(得分:2)

您如何期望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个字节?