使用C ++ recv winsocket2进行HTTP保持活动

时间:2011-02-08 02:26:50

标签: c++ http keep-alive recv

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

现在的问题是在我发送一个带有Keep-alive连接的HTTP GET请求之后,我调用了recv函数,它工作正常,除了它检索网站后,它仍然挥之不去,等待服务器的超时提示或关闭的连接!!

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

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

当我使用非阻塞套接字时,它的工作速度更快,但我不知道何时停止,我设置了str.rfind(“”, - 1,7)来停止检索数据。 但是,效率不高。

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

最佳,

2 个答案:

答案 0 :(得分:3)

检查Content-Length: xxxxx标头,并且只读取标头后面的xxxxx字节,该字节由空行终止(流中的CR-LF-CR-LF)。

更新

如果数据被分块:

  

Chunked Transfer-Encoding(reference

     

...

     

分块的邮件正文包含一个   一系列的块,然后是一条线   用“0”(零),然后是可选的   页脚(就像标题),和   空行。每个块由两个组成   部分:

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

此外,http://www.w3.org Chunked Transfer-Encoding的描述见3.6.1 @ http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html

答案 1 :(得分:0)

在套接字上设置非阻塞I / O标志,这样recv将立即返回,只有已经收到的数据量。将其与selectWSAEventSelectWSAAsyncSelect或完成端口相结合,以便在数据到达时通知(而不是忙碌等待)。