C:在HTTP上下文中使用select时解决部分头的情况

C:在HTTP上下文中使用select时解决部分头的情况,c,http,select,buffering,C,Http,Select,Buffering,这是关于我先前的一个问题,该问题已经得到了回答: 我的协议实际上在发送任何其他数据之前先发送它最初要发送的数据量。但是昨天,当我用浏览器测试我的代码时,我有一个问题: 很多人建议我检查消息长度,但以浏览器为例。浏览器的HTTP请求首次发送到服务器时没有大小。现在,假设我使用了一个256字节的缓冲区,如果我在每个多路复用操作之间不断接收部分头,我应该如何管理这个客户机的数据结构?当我不断获取更多数据时,请继续使用realloc,然后当我遇到终止序列('\r\n')时,是否假定已接收到所有数据 我

这是关于我先前的一个问题,该问题已经得到了回答:

我的协议实际上在发送任何其他数据之前先发送它最初要发送的数据量。但是昨天,当我用浏览器测试我的代码时,我有一个问题:

很多人建议我检查消息长度,但以浏览器为例。浏览器的HTTP请求首次发送到服务器时没有大小。现在,假设我使用了一个256字节的缓冲区,如果我在每个多路复用操作之间不断接收部分头,我应该如何管理这个客户机的数据结构?当我不断获取更多数据时,请继续使用realloc,然后当我遇到终止序列('\r\n')时,是否假定已接收到所有数据

我的意思是,有这样的东西:

typedef struct {
   int fd;
   char *data;
} CLIENT;

然后继续在数据上使用realloc?我被告知要分配最大协议头的缓冲区大小,但这是唯一的方法吗?

按大小重新分配缓冲区是可以的。我会选择比256-1024或4096稍大一点的缓冲区。分配HTTP等协议的最大缓冲区大小实际上是不可行的。您还可以在缓冲区上构建一个能够读取行的抽象,就像fgets在文件上所做的那样*


请记住,读取区块可能会读取HTTP头的最后一部分和HTTP正文的一部分(如果有的话),因此您需要确保正确地分割缓冲区,因为您可能希望将标头与正文分离。您还必须查找Content Length:header,对其进行解析,以便知道正文的长度。

我使用大缓冲区的唯一问题是很难定义“大”。如果我的服务器也支持PUT请求,那么如果没有适当的逻辑,我仍然必须面对复杂的情况。