2

我正在编写自己的 HTTP 提取器套接字。我在 MVC++ 和 winsocket2.h 中使用 C++ 我能够对套接字进行编程以连接到所需网站的服务器并发送 HTTP GET 请求。

现在的问题是,在我使用 Keep-alive 连接发送 HTTP GET 请求后,我调用了 recv 函数,它工作正常,除了在检索网站后,它一直徘徊并等待来自服务器或连接的超时提示关闭!

根据服务器的保持活动超时,这需要几秒钟的时间,因此,我无法从保持活动的 HTTP 设置中受益。

如何在检索网站后告诉 recv 函数停止并将命令返回给我,以便我可以发送另一个 HTTP 请求,同时避免另一个握手机制。

当我使用非阻塞套接字时,它的工作速度更快,但我不知道什么时候停止,我设置了一个 str.rfind("",-1,7) 来停止检索数据。但是,它不是很有效。

有谁知道这样做的方法,或者当连接保持活动状态时 HTTP 服务器发送的最后一个字符是什么,所以我可以将其用作停止决定。

最好的,

4

2 回答 2

3

检查Content-Length: xxxxx标头,仅读取标头之后的 xxxxx 字节,以空行终止(流中的 CR-LF-CR-LF)。

更新

如果数据被分块:

分块传输编码(参考

...

分块的消息正文包含一系列块,后跟一个带有“0”(零)的行,然后是可选的页脚(就像标题一样)和一个空白行。每个块由两部分组成:

  • 包含块数据大小的行,以十六进制表示,可能后跟一个分号和您可以忽略的额外参数(目前没有标准),并以 CRLF 结尾。
  • 数据本身,然后是 CRLF。

此外,http://www.w3.org对 Chunked Transfer-Encoding 的描述在第 3.6.1 节 @ http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html中。

于 2011-02-08T02:51:50.037 回答
0

在套接字上设置非阻塞 I/O 标志,这样它recv就会立即返回,只接收到尽可能多的数据。将此与selectWSAEventSelectWSAAsyncSelect或完成端口结合起来,以便在数据到达时得到通知(而不是忙着等待)。

于 2011-02-08T02:57:42.990 回答