Nik*_*nko 9 c++ boost boost-asio
我在boost :: asio上有一个TCP服务器,它监听连接并在获取后开始使用boost :: asio :: write在循环中发送数据块.
bool TcpServer::StartTcpServer(std::shared_ptr<boost::asio::io_service>  io_service)
{
    m_ioservice = io_service;
    m_acceptor.reset(new boost::asio::ip::tcp::acceptor(*m_ioservice, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), m_port)));
    m_socket = std::unique_ptr<boost::asio::ip::tcp::socket>(new boost::asio::ip::tcp::socket(*m_ioservice));
    m_socket->close();
    m_acceptor->async_accept(*m_socket, m_peer_endpoint,   boost::bind(&TcpServer::AcceptHandler, this, boost::asio::placeholders::error)); 
    m_io_thread.reset(new std::thread([this]{
    try
    {
        this->m_ioservice->run();
    }
    catch(const boost::system::system_error & err){print logs}
    catch(...){print another logs}
    }));
}
void TcpServer::AcceptHandler(const boost::system::error_code &ec)
{
    while(true)
    {
         try
         {
             boost::asio::write( *m_socket, boost::asio::buffer(data->c_str(), data->size()), boost::asio::transfer_all());  
         } 
         catch(const boost::system::system_error & err){print logs}
         catch(...){print another logs}
    }
}
Run Code Online (Sandbox Code Playgroud)
如果我手动停止接收器,则会抛出并正确处理损坏管道的异常.但有时会发生破裂的管道(我认为连接不良的原因),异常奇迹般地落在所有捕获中并且应用程序终止:
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
Run Code Online (Sandbox Code Playgroud)
检查核心我发现它发生在boost :: asio :: write中,起源于io_service :: run().我究竟做错了什么?
此外,我尝试使用async_write重写TCP服务器,但它仍然发生,但不是经常发生.
EDIT1:如果我手动停止接收器导致管道损坏,我会得到完全相同的异常和完全相同的callstack,但这个我可以处理.
EDIT2:根据我的理解,现在不可捕获的异常可能是因为太多数据通过套接字发送得太快.不过不确定.
中的错误消息terminate实际上确实解释了发生的情况。boost::exception_detail::clone_impl正在失败。如果不深入研究代码,我会假设它用于实现异常类的复制构造函数。如果这个复制构造函数在异常处理过程中抛出异常,它将绕过异常块,异常将向上传播。(即使您通过引用进行捕获,编译器仍可能会生成副本。)
现在我不知道为什么复制构造函数失败;这个问题没有足够的知识。但是这个与异步 I/O 相关的问题有一个非常相似的问题,其中的症结似乎是 ashared_ptr在异常处理之前被销毁。看起来很相似。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           2223 次  |  
        
|   最近记录:  |