[英]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);
调用read
, valread
保留您读取的字节数,并且这是唯一保留此信息的东西。 但是,您尝试不使用该值就将读取的数据追加到现有缓冲区上-因此, 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.