C++ “促进亚洲一体化”;本地系统中断了网络连接;关于异步读取
我在使用boost asio创建一个非常简单的基于TCP的服务器-客户端连接时遇到了一个问题。当我从服务器上的客户端获得连接并进入处理异步读取的方法时,我会检查是否有错误,并且总是收到错误1236,这会给出消息“网络连接被本地系统中止” 我刚刚开始使用boost,所以我对库的工作原理以及我可能会犯的错误并不十分熟悉。我在下面提供了我的代码的精简版本: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
/*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
习惯用法,或者在某些“连接管理器”中存储1shared\u ptr
.对不起,我应该包含头代码。客户端连接确实使用了enable_shared_from_this,但是,再仔细查看一下,似乎我在绑定句柄方法的地方仍然使用了“this”而不是“this->shared_from_this()”我已经更改了它,现在它似乎可以工作了,所以我将把你的回答标记为答案。非常感谢。@Sam Yes,“shared\u from\u this idiom”在这个上下文中意味着将处理程序绑定到shared\u from\u this()
的结果,从而至少延长对象的生命周期,直到异步操作完成为止。