我正在使用boost :: asio开发异步客户端TCP程序。我对公认的做法有疑问:如果套接字中断或断开连接,我应该让我的io_context线程退出(即不发出任何async_connect请求并让我的run方法退出),让主线程重新启动io_context并尝试async_connect还是应该给async_connect请求阻止退出io_context线程(即发出任何async_connect请求,而不退出我的run方法)。哪种方法更可接受。
按照我的假设,退出io_context线程的好处是,您从新的干净线程开始(从新的板岩开始),缺点是计算量,资源需求和执行时间更多。
相反,如果继续使用当前的io_context线程,即我发出async_connect请求以阻止io_context线程退出,这样可以节省计算,资源需求和执行时间,但我得不到保证。
这两种方法中哪一种更可取?
void AsyncSocket::recieveHandler(const boost::system::error_code& ec, std::size_t bytes_transferred)
{
fmt::print("In recieve handler, Error Code : {}\nBytes recieved : {}\n", ec.message(), bytes_transferred);
try
{
std::atomic_store(std::addressof(this->receivingData), false);
if (ec not_eq boost::system::errc::success)
{
#ifdef _DEBUG
fmt::print("Error in WebSocket::recieveHandler. Error : {0}\n", ec.message());
#endif // _DEBUG
LOG_ERROR << ec.message();
switch (ec.value())
{
case boost::asio::error::eof :
case boost::asio::error::connection_reset :
case boost::asio::error::connection_aborted :
case boost::asio::error::network_reset :
case boost::asio::error::network_down :
case boost::asio::error::network_unreachable :
if (this->isSocketAlive() and this->socket.is_open())
this->socket.close();
std::atomic_store(std::addressof(this->socketAlive), false);
//this->connectSocket(); //[1]
return;
default:
break;
}
}
else
{
this->readDataQueue.push(std::string(reinterpret_cast <const char *> (this->readDataBuffer.data()), bytes_transferred));
std::atomic_store(std::addressof(this->readComplete), true);
}
}
catch (const std::exception& ex)
{
#ifdef _DEBUG
fmt::print("Error in WebSocket::sendHandler. Error : {0}\n", ex.what());
#endif // _DEBUG
LOG_ERROR << "Exception : " << ex.what() << "Data : " << this->writeDataQueue.front();
}
this->recieveDataSocket();
}
注释1使io_context线程退出,取消注释阻止io_context线程退出。