Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;“已打开”;Asio中的新连接出错_C++_Tcp_Boost Asio - Fatal编程技术网

C++ &引用;“已打开”;Asio中的新连接出错

C++ &引用;“已打开”;Asio中的新连接出错,c++,tcp,boost-asio,C++,Tcp,Boost Asio,我使用的是Asio的非Boost版本,并基于以下代码制作了一个TCP服务器: 我可以很好地与服务器建立连接,但只是第一次。如果我断开客户端连接,然后再次尝试连接,Asio会将“已打开”错误传递给我的accept处理程序。从代码中可以看到,在接受连接之前,会创建tcp_连接类的新实例。我不确定为什么会出现这个错误,即使它是一个完全独立的实例,其套接字不应该已经打开。任何帮助都将不胜感激 提前谢谢 编辑: 以下是服务器类: 和客户机类(相当于示例中的tcp_连接类): 这可能是因为断开连接时未正确

我使用的是Asio的非Boost版本,并基于以下代码制作了一个TCP服务器:

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

提前谢谢

编辑:

以下是服务器类:

和客户机类(相当于示例中的tcp_连接类):
这可能是因为断开连接时未正确关闭插座。由于无法处理的异常(如信号9)可能会导致断开连接,因此即使进程没有正常结束,您也需要一个解决方案来工作

我相信这可以解决问题:

您有:

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

客户端类不属于服务器。这没有道理

你有:


在我的tcp_连接类“async_读取处理程序”中,我检查Asio是否向其传递了错误。如果有,我会打印一条消息,然后在进行一些清理后,在连接的套接字上调用.shutdown()和.close()。@Fauxbestan如果程序捕捉到信号怎么办?比如ctrl+c?还是干脆杀了它?不管怎样,试试链接中的标志,让我知道它是否有效…我之前确实试过在接受程序上设置该标志,看看这是否是问题所在。可悲的是,它没有解决任何问题…@Fauxbestan你试过在客户端设置它吗?编辑:哦,您是在接受后立即收到错误,而不是在连接后立即收到错误。。编辑2:经过更多的思考,我仍然认为这是同一个问题。尝试在客户端设置标志,服务器端标志应该影响绑定方法,而客户端应该强制关闭死连接,我想我没有访问客户端源代码的权限。我知道客户端每次连接时都应该使用不同的本地端口。几年前,我用C#为同一个客户机编写了一个服务器,没有任何问题。我不知道还能做什么。正如我在OP中所说的,客户机类相当于tcp_连接类。它不是TCP客户端;它只管理与客户端的连接。这只是一个命名选择,并不影响代码。
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));
}