3

我有一个代码来获取 html 文件的来源,但它也得到“标题响应”或 sth。像那样(我不知道怎么称呼它)没有这个标题我怎么能得到它?

我的代码:

#include "StdAfx.h"
#include <iostream>
#include <boost/array.hpp>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;

std::size_t completion(const boost::system::error_code& error, std::size_t bytes_transfered)
{
    return ! error;
}

int main(int argc, char* argv[])
{
    boost::asio::io_service io_service;
    boost::asio::ip::address addr = boost::asio::ip::address::from_string("31.170.161.16");
    boost::asio::ip::tcp::endpoint endpoint(addr, 80);
    tcp::socket socket(io_service);
    socket.connect(endpoint);
    boost::asio::streambuf request;
    std::ostream requestStream(&request);
    requestStream << "GET /xD1azt4_panel/bhc.html HTTP/1.1\r\n"
                  << "Connection: Keep-Alive\r\n"
                  << "Host: dublersoft.hostoi.com\r\n\r\n";

    boost::asio::write(socket, request);
    boost::asio::streambuf respond;
    boost::system::error_code ec;
    boost::asio::read(socket, respond, completion, ec);
    std::cout << &respond << std::endl;
    getchar();
    return 0;
}

结果: 结果

4

3 回答 3

4

很惊讶我也用它作为我的简单 http 客户端,所以我只是分享我的方法,如果你以后需要,标头放在一个向量中,响应数据放在 ostream 对象中。

int do_get(std::string &host_,std::string &port_, std::string url_path,std::ostream &out_,std::vector<std::string> &headers, unsigned int timeout)
{
    try{
        using namespace boost::asio::ip;
        tcp::iostream request_stream;
        if (timeout>0){
            request_stream.expires_from_now(boost::posix_time::milliseconds(timeout));
        }
        request_stream.connect(host_,port_);
        if(!request_stream){
            return -1;
        }
        request_stream << "GET " << url_path << " HTTP/1.0\r\n";
        request_stream << "Host: " << host_ << "\r\n";
        request_stream << "Accept: */*\r\n";
        request_stream << "Cache-Control: no-cache\r\n";
        request_stream << "Connection: close\r\n\r\n";
        request_stream.flush();
        std::string line1;
        std::getline(request_stream,line1);
        if (!request_stream)
        {
            return -2;
        }
        std::stringstream response_stream(line1);
        std::string http_version;
        response_stream >> http_version;
        unsigned int status_code;
        response_stream >> status_code;
        std::string status_message;
        std::getline(response_stream,status_message);
        if (!response_stream||http_version.substr(0,5)!="HTTP/")
        {
            return -1;
        }
        if (status_code!=200)
        {
            return (int)status_code;
        }
        std::string header;
        while (std::getline(request_stream, header) && header != "\r")
            headers.push_back(header);
        out_ << request_stream.rdbuf();
        return status_code;
    }catch(std::exception &e){
        std::cout << e.what() << std::endl;
        return -3;
    }

}
于 2012-06-11T15:14:07.747 回答
2

答案是,如果你想在标题和正文之间分离,你将不得不使用更高级别的东西。

另一种方法是只扫描 \r\n\r\n,它是 headers/body 之间的分隔符,正如您可以在此处找到的官方 http 请求示例中所做的那样。

于 2012-06-11T15:14:55.240 回答
0

Web 服务器将始终返回至少几个标题行——一些(至少HTTP..., 和Server:...)是 HTTP 的 RFC 要求的。

第一个空行标记标题的结尾。之后是身体。您需要阅读但显然想忽略第一个空行之前的所有数据,并保留之后的所有内容。

于 2012-06-11T15:12:03.220 回答