"已经开放"在Asio中新连接出错

时间:2015-04-25 21:09:30

标签: c++ tcp boost-asio

我使用非Boost版本的Asio,并根据http://think-async.com/Asio/asio-1.11.0/doc/asio/tutorial/tutdaytime3.html

上的代码创建了一个TCP服务器

我可以很好地建立与服务器的连接,但只是第一次。如果我断开我的客户端然后再次尝试连接,Asio会通过"已经打开"错误到我的接受处理程序。从代码中可以看出,在接受连接之前,会创建tcp_connection类的新实例。我不确定为什么我会收到此错误,即使它是一个完全独立的实例,其套接字不应该已经打开。任何帮助将不胜感激。

提前致谢。

编辑:

这是服务器类: http://pastebin.com/yvZmFQvA

客户端类(相当于示例中的tcp_connection类): http://pastebin.com/LDhr2nZz

2 个答案:

答案 0 :(得分:1)

这可能是因为您在断开连接时没有正确关闭套接字。由于无法处理的异常(例如信号9)可能会导致断开连接,即使流程没有正常消失,您也需要一个解决方案才能工作......

我有理由这可以解决它:

Socket options SO_REUSEADDR and SO_REUSEPORT, how do they differ? Do they mean the same across all major operating systems?

答案 1 :(得分:0)

你有:

void server::do_accept() {
    //client::pointer con = client::create(acceptor_.get_executor().context());
    client::pointer con = client::create(acceptor_.get_io_service());

    acceptor_.async_accept(con->socket(),
            std::bind(&server::on_accepted, this, con,
            std::placeholders::_1));

}

客户端类不属于服务器。这没有意义。

您的source material有:

void start_accept()
{
    tcp_connection::pointer new_connection =
      tcp_connection::create(acceptor_.get_executor().context());

    acceptor_.async_accept(new_connection->socket(),
        boost::bind(&tcp_server::handle_accept, this, new_connection,
          asio::placeholders::error));
}