【问题标题】:How does curl separate data to send?curl 如何分开发送数据?
【发布时间】:2022-08-15 23:44:35
【问题描述】:

我正在使用 C++ WinSock 套接字编写 HTTP 服务器,我使用 recv卷曲通过 TCP 流。当我发送小文件时,一切正常,但是对于较大的文件,curl 似乎会拆分数据并分别发送部分,因为在这种情况下,recv 的返回值仅等于 HTTP 标头的大小,而在客户端 curl 失败接收响应。这让我假设如果数据量太大,curl 可以将数据拆分为标题和正文,但我找不到任何可以确认的文档。

为了调整我的服务器以接收来自 curl 的任何数据,我需要知道 curl 如何发送它。

curl 是否拆分大数据发送?我应该期待多少个零件?

  • 你应该永远不能根据对recv 的单个调用返回多少字节来假设任何事情。 HTTP 协议对如何传递数据有非常具体的规则。首先,您需要根据 \"headers end with double /r/n\" 规则读取标题(为此,您需要循环 recv() 调用,直到找到标记或超出您选择的某些限制)。然后你解析头文件,读取Content-Length 头文件(如果存在,如果没有,事情会变得更复杂),最后通过循环没有该值的recv 调用来读取正文。这就是 HTTP 的工作原理,CURL 必须服从它。
  • @freakish我已经有一个HTTP解析器,问题是我只有在收到所有数据时才开始解析缓冲区。有时我会在一次射门中得到一个头球和一个身体,有时不是。先解析头部然后继续接收正文不是问题,但是我怎么知道我是否已经收到它
  • 我已经解释过:“标题以双 /r/n 结尾”。您需要循环 recv() 调用,直到在缓冲区中找到特殊的字符序列。让我给你最后一条建议:不要编写自己的 HTTP 解析器,这项任务乏味、困难、耗时且容易出错。 HTTP 很难。
  • 没有办法在不解析的情况下接收整个 HTTP 响应,您需要能够处理 recv 返回拆分为任意块的响应,这通常通过某种缓冲来完成
  • TCP - cURL 和大多数互联网使用的协议 - 可以拆分您的消息。任何对recv 的调用(不管它是否来自cURL)都应该被写入,以说明接收到的数据不是发送的完整消息的可能性。

标签: c++ http curl winsock


【解决方案1】:

有时我会在一次射门中得到一个头球和一个身体,有时不是。

您的服务器必须在恢复空行 \r\n 时解析标头。如果有标头Expect: 100-continue,服务器应该发送一个状态为100 Continue的响应。“有时不是”发生是因为您的服务器不遵循此规则。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2018-12-21
    • 1970-01-01
    • 2014-07-23
    • 2018-03-09
    相关资源
    最近更新 更多