【发布时间】: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)都应该被写入,以说明接收到的数据不是发送的完整消息的可能性。