Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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++ “促进亚洲一体化”;本地系统中断了网络连接;关于异步读取_C++_Boost_Network Programming_Boost Asio - Fatal编程技术网

C++ “促进亚洲一体化”;本地系统中断了网络连接;关于异步读取

C++ “促进亚洲一体化”;本地系统中断了网络连接;关于异步读取,c++,boost,network-programming,boost-asio,C++,Boost,Network Programming,Boost Asio,我在使用boost asio创建一个非常简单的基于TCP的服务器-客户端连接时遇到了一个问题。当我从服务器上的客户端获得连接并进入处理异步读取的方法时,我会检查是否有错误,并且总是收到错误1236,这会给出消息“网络连接被本地系统中止” 我刚刚开始使用boost,所以我对库的工作原理以及我可能会犯的错误并不十分熟悉。我在下面提供了我的代码的精简版本: /*Client connection code*/ ClientConnection::ClientConnection(boost::asio

我在使用boost asio创建一个非常简单的基于TCP的服务器-客户端连接时遇到了一个问题。当我从服务器上的客户端获得连接并进入处理异步读取的方法时,我会检查是否有错误,并且总是收到错误1236,这会给出消息“网络连接被本地系统中止”

我刚刚开始使用boost,所以我对库的工作原理以及我可能会犯的错误并不十分熟悉。我在下面提供了我的代码的精简版本:

/*Client connection code*/
ClientConnection::ClientConnection(boost::asio::io_service& io_service) : m_Socket(io_service)
{

}

ClientConnection::ClientConnectionPointer ClientConnection::Create(boost::asio::io_service& io_service)
{
    return ClientConnection::ClientConnectionPointer(new ClientConnection(io_service));
}

void ClientConnection::handle_write(const boost::system::error_code& error, size_t bytes_transferred)
{
    //once we've written our packet, just wait for more
    m_Socket.async_read_some(boost::asio::buffer(m_IncomingBytesBuffer, MAX_BYTES_LENGTH),
        boost::bind(&ClientConnection::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}

void ClientConnection::handle_read(const boost::system::error_code& error, size_t bytes_transferred)
{
    if(!error)
    {
        //deal with the data that comes in here

    }
    else
    {
        std::cout << "Error reading port data" << std::endl;
        std::cout <<  error.message() << std::endl;
    }

}

tcp::socket& ClientConnection::GetSocket(void)
{
    return m_Socket;
}

void ClientConnection::RunClient(void)
{
    std::cout << "Client connected." << std::endl;
    //start by reading data from the connection
    m_Socket.async_read_some(boost::asio::buffer(m_IncomingBytesBuffer, MAX_BYTES_LENGTH),
        boost::bind(&ClientConnection::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}



/*Listener server code here*/
BarcodeServer::BarcodeServer(boost::asio::io_service& io_service) : m_acceptor(io_service, tcp::endpoint(tcp::v4(), SERVER_PORT_NUMBER))
{
    start_accepting_connections();
}

void BarcodeServer::start_accepting_connections(void)
{
    std::cout << "Waiting for a connection." << std::endl;
    ClientConnection::ClientConnectionPointer new_connection = ClientConnection::Create(m_acceptor.get_io_service());

    m_acceptor.async_accept(new_connection->GetSocket(), boost::bind(&BarcodeServer::handle_accepted_connection, this, new_connection, boost::asio::placeholders::error));
}

void BarcodeServer::handle_accepted_connection(ClientConnection::ClientConnectionPointer new_connection, const boost::system::error_code& error)
{
    if(!error)
    {
        new_connection->RunClient();
    }
    start_accepting_connections();
}


/*main code here*/
try
{
    boost::asio::io_service io_service;
    BarcodeServer server(io_service);
    io_service.run();
}
catch(std::exception& e)
{
    cout << "Error when running server:" << endl;
    cout << e.what() << endl;
    return RETURN_CODE_SERVER_RUN_ERROR;
}
return RETURN_CODE_SUCCESS;
/*客户端连接代码*/
ClientConnection::ClientConnection(boost::asio::io_服务和io_服务):m_套接字(io_服务)
{
}
ClientConnection::ClientConnectionPointer ClientConnection::Create(boost::asio::io_服务和io_服务)
{
return ClientConnection::ClientConnectionPointer(新的ClientConnection(io_服务));
}
void ClientConnection::handle\u write(const boost::system::error\u代码和错误,大小\u t字节\u传输)
{
//一旦我们写了我们的包,就等着更多吧
m_Socket.async_read_some(boost::asio::buffer(m_IncomingBytesBuffer,最大字节长度),
boost::bind(&ClientConnection::handle_read,this,boost::asio::placeholders::error,boost::asio::placeholders::bytes_transfer));
}
void ClientConnection::handle\u read(const boost::system::error\u代码和错误,大小\u t字节\u传输)
{
如果(!错误)
{
//处理这里的数据
}
其他的
{

std::coutClientConnection
的生存期在
handle\u accepted\u connection()
退出后结束,因为
shared\u ptr
的所有实例都超出范围并被销毁


为了避免这种情况,您可以在
ClientConnection
成员函数中使用
shared\u from\u this
习惯用法,或者在某些“连接管理器”中存储1
shared\u ptr
.

对不起,我应该包含头代码。客户端连接确实使用了enable_shared_from_this,但是,再仔细查看一下,似乎我在绑定句柄方法的地方仍然使用了“this”而不是“this->shared_from_this()”我已经更改了它,现在它似乎可以工作了,所以我将把你的回答标记为答案。非常感谢。@Sam Yes,“shared\u from\u this idiom”在这个上下文中意味着将处理程序绑定到
shared\u from\u this()
的结果,从而至少延长对象的生命周期,直到异步操作完成为止。