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

答えは、ヘッダーと本文を分離したい場合は、より高いレベルで何かを使用する必要があるということです。

それを行う別の方法は、ここで見つけることができる公式の http 要求の例で行われているように、ヘッダー/本文間の区切り文字である \r\n\r\n をスキャンすることです。

于 2012-06-11T15:14:55.240 に答える
0

Web サーバーは常に、少なくとも数行のヘッダー行を返します。HTTP の RFC では、数行 (少なくともHTTP...と) が必要です。Server:...

最初の空白行はヘッダーの終わりを示します。その次は本体です。最初の空白行までのすべてのデータを読み取る必要がありますが、明らかに無視し、その後はすべて保持します。

于 2012-06-11T15:12:03.220 に答える