0
我目前正试图弄清楚如何正确地重用asio套接字。我能够成功发出请求并获得结果。第二次发出请求时,我收到一个异常:read_some:文件结束。第二次写入似乎工作正常,我看到第二个http请求通过wireshark发送。我在想,有一些信息会遗漏在以某种方式破坏我的连接的套接字上。任何帮助将不胜感激这个问题。这里是我使用的代码:重新使用ASIO连接,read_some例外
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;
}
编辑:增加了主要功能。
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);
}
如何使用上述代码并不十分清楚。 “第一次”结束于何处,“第二次”开始于何处?你确定对方在第一次之后没有关闭连接吗? –
对不起,把这部分留下。基本上第一次写入时,一切运行良好。下一次尝试使用写入时,会出现读取异常。 – Eumcoz
这意味着http服务器在第一个请求完成后关闭连接,即它不遵守“Connection:keep-alive”标头。当你得到第一个响应时,你看到“Connection:keep-alive”标题吗?您是否尝试请求“HTTP/1.1”? –