【问题标题】:"Already Open" error on new connection in AsioAsio 中的新连接出现“已打开”错误
【发布时间】:2015-04-26 12:29:08
【问题描述】:

我正在使用非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

【问题讨论】:

    标签: c++ tcp boost-asio


    【解决方案1】:

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

    我相信这可以解决它:

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

    【讨论】:

    • 在我的 tcp_connection 类的 async_read 处理程序中,我检查 Asio 是否传递了错误。如果是这样,我会打印一条消息,然后在进行一些清理后在连接的套接字上调用 .shutdown() 和 .close()。
    • @FauxBestaan​​ 如果程序捕捉到信号怎么办?比如ctrl+c?还是干脆杀了它?无论如何,试试链接中的标志,让我知道它是否有效......
    • 我实际上尝试在接受器上设置该标志,以查看是否是问题所在。可悲的是,它没有解决任何问题......
    • @FauxBestaan​​ 您是否尝试在客户端设置它?编辑:哦,您在接受后立即收到错误,而不是在连接后立即收到错误。.edit2:经过更多努力,我仍然认为这是同一个问题。尝试在客户端也设置标志,服务器端标志应该影响绑定方法,而客户端应该强制关闭我认为的死连接
    • 我无权访问客户端的源代码。我知道客户端每次连接时都应该使用不同的本地端口。几年前,我用 C# 为同一个客户端编写了一个服务器,没有任何问题。我不知道还能做什么。
    【解决方案2】:

    你有:

    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));
    }
    

    【讨论】:

    • 正如我在我的 OP 中所说,客户端类相当于 tcp_connection 类。它不是 TCP 客户端;它只是管理与客户端的连接。这只是一个命名选择,不会影响代码。
    猜你喜欢
    • 1970-01-01
    • 2011-11-14
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 2012-06-22
    相关资源
    最近更新 更多