2

这是参考我之前已经回答的问题:

C:使用选择调用,当我阅读时,我如何跟踪数据?

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

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

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

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

然后继续对数据使用 realloc?有人告诉我分配最大协议头的缓冲区大小,但这是唯一的方法吗?

4

1 回答 1

1

重新分配大小的缓冲区很好。我会选择比 256 - 1024 或 4096 大一点的缓冲区。分配像 HTTP 这样的协议的最大缓冲区大小实际上并不可行。您还可以在缓冲区顶部构建一个能够读取行的抽象 - 就像 fgets 在 FILE* 上所做的那样

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

于 2010-01-29T22:48:04.337 回答