Http 重用ASIO连接,读取一些异常

Http 重用ASIO连接,读取一些异常,http,boost,network-programming,boost-asio,http-1.0,Http,Boost,Network Programming,Boost Asio,Http 1.0,我目前正试图找出如何正确地重用asio套接字。我能够成功地发出请求,并得到结果。第二次发送请求时,我得到一个异常:read_some:End of file。第二次写入似乎工作正常,我看到第二个http请求通过wireshark发出。我认为套接字上有剩余的信息以某种方式破坏了我的连接。在此问题上如有任何帮助,将不胜感激。以下是我正在使用的代码: persistent_connection::persistent_connection(std::string ip, std::string por

我目前正试图找出如何正确地重用asio套接字。我能够成功地发出请求,并得到结果。第二次发送请求时,我得到一个异常:read_some:End of file。第二次写入似乎工作正常,我看到第二个http请求通过wireshark发出。我认为套接字上有剩余的信息以某种方式破坏了我的连接。在此问题上如有任何帮助,将不胜感激。以下是我正在使用的代码:

persistent_connection::persistent_connection(std::string ip, std::string port):
io_service_(), socket_(io_service_), is_setup_(false)
{
    boost::asio::ip::tcp::resolver resolver(io_service_);
    boost::asio::ip::tcp::resolver::query query(ip,port);
    boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);
    boost::asio::ip::tcp::endpoint endpoint = *iterator;
    socket_.async_connect(endpoint, boost::bind(&persistent_connection::handler_connect, this, boost::asio::placeholders::error, iterator));
    io_service_.run();
}


void persistent_connection::handler_connect(const boost::system::error_code &ec, boost::asio::ip::tcp::resolver::iterator endpoint_iterator)
{
    if(ec)
    {
        std::cout << "Couldn't connect" << ec << std::endl;
        return;
    }
    else
    {
        boost::asio::socket_base::keep_alive keep_option(true);
        socket_.set_option(keep_option);
    }
}


void persistent_connection::write(std::string message)
{
    std::string request_stream = "GET /" + message + " HTTP/1.0\r\n";
    request_stream += "HOST: 10.1.10.220";
    request_stream += "Accept: */*\r\n";
    request_stream += "Connection: keep-alive\r\n\r\n";

    try
    {
        boost::asio::write(socket_, boost::asio::buffer(request_stream, request_stream.size()));
    }catch(std::exception& e)
    {
        std::cout << "Write exception: " << e.what() << std::endl;
    }

    boost::array<char,8192> buf;
    try
    {
        socket_.read_some(boost::asio::buffer(buf));
    }catch(std::exception& e)
    {
        std::cout << "Read exception: " << e.what() << std::endl;
    }

    std::string response = buf.data();
    std::cout << response << std::endl;
}
persistent\u connection::persistent\u connection(std::string ip,std::string port):
io_服务_u()套接字(io_服务_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
{
boost::asio::ip::tcp::解析器解析器(io\U服务);
boost::asio::ip::tcp::resolver::query查询(ip,端口);
boost::asio::ip::tcp::resolver::iterator iterator=resolver.resolve(查询);
boost::asio::ip::tcp::endpoint=*迭代器;
socket.async\u connect(端点,boost::bind(&persistent\u connection::handler\u connect,this,boost::asio::placeholders::error,iterator));
io_服务_uu.run();
}
void persistent_connection::handler_connect(const boost::system::error_code&ec,boost::asio::ip::tcp::resolver::iterator endpoint_iterator)
{
国际单项体育联合会(欧共体)
{

std::cout当您尝试
read_some
时出现此异常意味着HTTP服务器在第一个请求结束后关闭连接,即服务器忽略“connection:keep alive”头(注意HTTP 1.0服务器不一定支持持久连接)


但是,在1.1版本中,连接是无效的,因此请求“HTTP/1.1”应该可以解决此问题。

当您尝试
读取某些内容时出现此异常,这意味着HTTP服务器在第一个请求结束后关闭连接,即服务器忽略“连接:保持活动”标题(请注意,HTTP 1.0服务器不一定支持持久连接)


但是,在1.1版本中,连接是有限的,因此请求“HTTP/1.1”应该可以解决这个问题。

不太清楚如何使用上述代码。“第一次”在哪里结束,“第二次”在哪里结束开始?您确定对等方在第一次之后没有关闭连接吗?抱歉,遗漏了这一部分。基本上,第一次写入被调用,一切都正常运行。下次我尝试使用写入时,我会收到一个读取异常。这意味着http服务器在第一次请求完成后关闭连接,也就是说,它不遵守“连接:保持活动”标题。当您收到第一个响应时,是否看到“连接:保持活动”标题?是否尝试请求“HTTP/1.1”?谢谢,我正在测试的服务器似乎不支持保持活动,这就是问题所在。但请尝试请求HTTP/1.1-此版本默认支持保持活动。不太清楚如何使用上述代码。“第一次”在哪里结束,“第二次”在哪里结束开始?您确定对等方在第一次之后没有关闭连接吗?抱歉,遗漏了这一部分。基本上,第一次写入被调用,一切都正常运行。下次我尝试使用写入时,我会收到一个读取异常。这意味着http服务器在第一次请求完成后关闭连接,也就是说,它不遵守“Connection:keep alive”标题。当您收到第一个响应时,是否看到“Connection:keep alive”标题?您是否尝试请求“HTTP/1.1”?谢谢,我正在测试的服务器似乎不支持keep alive,这就是问题所在。但请尝试请求HTTP/1.1-此版本默认支持keep alive。
int main()
{
    persistent_connection p("10.1.10.220", "80");
    std::string check;
    do
    {
        std::cin >> check;
        if(check.compare("s") == 0)
        {
            std::cout << "Sending" << std::endl;
            p.write("100");
        }
    }while(check.compare("x") != 0);
}