我正在制作一个服务器,该服务器应该能够接受来自多个客户端的请求。为了确保我能够正确读取大型请求,我进行了以下代码段。
请求以<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?
因此循环永远不会终止。
为什么会这样?
答案 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
个字节?