开发者

HTTP keep-alive with C++ recv winsocket2

I'm Coding my own HTTP fetcher socket. I use C++ in MVC++ and winsocket2.h I was able to program the socket to connect to the required website's server and send an HTTP GET request.

Now the problem is after I send an HTTP GET request with Keep-alive connection, I call the recv function , and it works fine except after 开发者_如何学编程it retrieves the website, it stays lingering and waiting for time-out hint from the server or a connection to close!!

This takes a few seconds of less depending in the keep-alive timeout the servers has, Therefore, I can't benefit from the keep-alive HTTP settings.

How can I tell the recv function to stop after retrieving the website and gives back the command to me so I can send another HTTP request while avoiding another hand-shake regime.

When I use the non-blocking sockets it works faster, But I don't know when to stop, I set a str.rfind("",-1,7) to stop retrieving data. however, it is not very efficient.

Does anybody know a way to do it, or what is that last character send by the HTTP server when the connection is kept alive, so I can use it as a stopping decision.

Best,

Moe


Check for a Content-Length: xxxxx header, and only read xxxxx bytes after the header, which is terminated by a blank line (CR-LF-CR-LF in stream).

update

If the data is chunked:

Chunked Transfer-Encoding (reference)

...

A chunked message body contains a series of chunks, followed by a line with "0" (zero), followed by optional footers (just like headers), and a blank line. Each chunk consists of two parts:

  • a line with the size of the chunk data, in hex, possibly followed by a semicolon and extra parameters you can ignore (none are currently standard), and ending with CRLF.
  • the data itself, followed by CRLF.

Also, http://www.w3.org description of Chunked Transfer-Encoding is in section 3.6.1 @ http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html.


Set the non-blocking I/O flag on the socket, so that recv will return immediately with only as much data has already been received. Combine this with select, WSAEventSelect, WSAAsyncSelect, or completion ports to be informed when data arrives (instead of busy-waiting).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜