要访问某个主机上的资源,您只需在请求的第一行中指定资源的路径,就在“GET”之后。例如检查http://www.jmarshall.com/easy/http/#http1.1
GET /path/file.html HTTP/1.1
Host: www.host1.com:80
[blank line here]
我还建议使用一些可移植的库,比如 Boost.ASIO,而不是套接字。但我强烈建议您使用一些现有的、可移植的库来实现 HTTP 协议。当然,前提是它不是学习如何实现它的问题。
即使您想自己实现它,也值得了解现有的解决方案。例如,您可以通过以下方式使用 cpp-netlib ( http://cpp-netlib.org/0.10.1/index.html ) 获取网页:
using namespace boost::network;
using namespace boost::network::http;
client::request request_("http://127.0.0.1:8000/");
request_ << header("Connection", "close");
client client_;
client::response response_ = client_.get(request_);
std::string body_ = body(response_);
这是使用 cURL 库 ( http://curl.haxx.se/libcurl/c/simple.html ) 的方法:
#include <stdio.h>
#include <curl/curl.h>
int main(void)
{
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
/* example.com is redirected, so we tell libcurl to follow redirection */
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
/* always cleanup */
curl_easy_cleanup(curl);
}
return 0;
}
这两个库都是可移植的,但如果您想使用一些特定于 Windows 的 API,您可以查看 WinINet ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa383630%28v=vs.85% 29.aspx),但使用起来不太愉快。