在 C 中解析 HTTP 请求的有效方法

问题描述 投票:0回答:1

我正在用 C 语言编写一个 HTTP 服务器。请注意,我知道如何解析 HTTP 请求格式中的字符串

我的斗争如下:

HTTP 协议建立在 TCP 套接字之上。因此,客户端发送的请求不能保证仅在一次

read()
操作后就能一次性交付。因此,我需要读取请求直到标头末尾,获取
Content-Length
,然后继续进行
read()
主体知道我应该读取多少数据。

我正在使用 非阻塞 IO,以防某些读者认为这很重要。

对此,我有两个想法,每一个都有其严重的缺陷。

  1. read()
    一次一个字节,每次在每个
    "\r\n\r\n"
    之后检查缓冲区末尾是否为
    read()
    。然后获取
    Content-Length
    并阅读正文。由于
    read()
    系统调用的数量,效率非常低。

  2. 以较大的块读入缓冲区,每次检查是否使用

    strstr()
    读取请求的末尾以查找
    "\r\n\r\n"
    子字符串。当找到子字符串
    "\r\n\r\n"
    时,将其后面读取的字符数保存在变量
    n
    中,得到
    Content-Length
    。继续阅读
    Content-Length - n
    字符。由于必须在每个
    strstr()
    之后调用
    read()
    ,效率也很低。

关于如何更有效地做到这一点有什么建议吗?

c http sockets parsing httprequest
1个回答
0
投票

谈到内容,我建议逐字节读取,并让用户定义最大大小,因为连接可以随时关闭,并且读取固定大小,会禁用文件上传或更大的内容长度。 如果您想查看我的网络服务器,您可以将您想要的任何部分复制到您的网络服务器中 https://github.com/OUIsolutions/CWebStudio

© www.soinside.com 2019 - 2024. All rights reserved.