我正在编码自己的HTTP fetcher socket。我在MVC ++和winsocket2.h中使用C ++ 我能够对套接字进行编程以连接到所需网站的服务器并发送HTTP GET请求。
现在的问题是在我发送一个带有Keep-alive连接的HTTP GET请求之后,我调用了recv函数,它工作正常,除了它检索网站后,它仍然挥之不去,等待服务器的超时提示或关闭的连接!!
这需要几秒钟的时间,具体取决于服务器的保持活动超时, 因此,我无法从保持活动的HTTP设置中受益。
如何在检索网站后告诉recv函数停止并将命令发回给我,以便我可以发送另一个HTTP请求,同时避免另一个握手制度。
当我使用非阻塞套接字时,它的工作速度更快,但我不知道何时停止,我设置了str.rfind(“”, - 1,7)来停止检索数据。 但是,效率不高。
是否有人知道这样做的方法,或者当连接保持活动状态时HTTP服务器发送的最后一个字符是什么,所以我可以将它用作停止决定。
最佳,
萌
答案 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
将立即返回,只有已经收到的数据量。将其与select
,WSAEventSelect
,WSAAsyncSelect
或完成端口相结合,以便在数据到达时通知(而不是忙碌等待)。