我正在用 C 语言编写一个 HTTP 服务器。请注意,我知道如何解析 HTTP 请求格式中的字符串。
我的斗争如下:
HTTP 协议建立在 TCP 套接字之上。因此,客户端发送的请求不能保证仅在一次
read()
操作后就能一次性交付。因此,我需要读取请求直到标头末尾,获取 Content-Length
,然后继续进行 read()
主体知道我应该读取多少数据。
我正在使用 非阻塞 IO,以防某些读者认为这很重要。
对此,我有两个想法,每一个都有其严重的缺陷。
read()
一次一个字节,每次在每个 "\r\n\r\n"
之后检查缓冲区末尾是否为 read()
。然后获取 Content-Length
并阅读正文。由于 read()
系统调用的数量,效率非常低。
以较大的块读入缓冲区,每次检查是否使用
strstr()
读取请求的末尾以查找 "\r\n\r\n"
子字符串。当找到子字符串"\r\n\r\n"
时,将其后面读取的字符数保存在变量n
中,得到Content-Length
。继续阅读 Content-Length - n
字符。由于必须在每个 strstr()
之后调用 read()
,效率也很低。
关于如何更有效地做到这一点有什么建议吗?
谈到内容,我建议逐字节读取,并让用户定义最大大小,因为连接可以随时关闭,并且读取固定大小,会禁用文件上传或更大的内容长度。 如果您想查看我的网络服务器,您可以将您想要的任何部分复制到您的网络服务器中 https://github.com/OUIsolutions/CWebStudio