boost asio async_read中的随机EOF

时间:2016-12-28 15:27:32

标签: c++ multithreading boost

我从EOF收到boost::asio::async_read错误。我已经浏览了以下帖子(以及其他一些类似的帖子)并没有帮助我。

  1. EOF in async_read() in boost::asio
  2. Random EOF in boost asio in multi thread
  3. EOF in boost::async_read with thread_pull and boost 1.54
  4. 关于我的应用程序:我开发了一个WebBrowser(使用IE WebBrowser控件)和浏览器通信的代理服务器。没有什么可以在浏览器中检查,因为IE引擎内部发生了一切。在代理服务器中,我随EOF以及任何其他阅读版本(async_readasync_read_some())随机收到read()错误。而这个问题我只面临发布版本而不是调试版本(至少还没有)。在调试版本中,一切正常。

    以下是我的阅读功能。我不知道是否有任何种族状况或我遗失的任何事情。

    void SocksProxyConnection::HandleRead(const boost::system::error_code& errorCode, std::size_t bytesTransferred)
    {
        //Check for the errors
        if (errorCode)
        {
            std::string connectionID = boost::lexical_cast<std::string>(m_connectionID);
            UNUSED(connectionID);
    
            if ((errorCode.value() == boost::asio::error::connection_reset))
            {
                TVLOG_INFO(LOG("SocksProxyConnection: Connection Reset ConnectionID: %1%") % (boost::lexical_cast<std::string>(m_connectionID)).c_str());
                m_removeConnectionFromMapFunction(m_connectionID);
                SendConnectionCloseCommand();
            } 
            else if (errorCode.value() == boost::asio::error::eof)
            {
                LOG_ERRORCODE(L"SocksProxyConnection: End Of File error", errorCode);
            }
            else if (errorCode.value() != boost::asio::error::operation_aborted)
            {
                //Case: Error occurred while reading
                LOG_ERRORCODE(L"SocksProxyConnection: Error in reading the data from the webBrowser", errorCode);
            }
    
            return;
        }
    
        //No errors
    
        //Send the data to the remote server
        ForwardBuffer(bytesTransferred);
    
        //Perform the async read operation.
        boost::asio::async_read(m_socket, boost::asio::buffer(m_readDataBuffer.get(), DataBufferSize), boost::asio::transfer_at_least(1),
                                m_Strand.wrap(boost::bind(&SocksProxyConnection::HandleRead,
                                            shared_from_this(),
                                            boost::asio::placeholders::error,
                                            boost::asio::placeholders::bytes_transferred)));
    
    }
    

    此代理服务器有一个专用的io_service,其中包含两个异步调用async_accept()async_read()。将数据发送到浏览器不是异步的。我正在使用阻止write()功能。我不知道这是否有所不同。

    在增强1.54中也有这个bug导致了类似的问题。但那是3年前的事情并且已经修复。目前,我正在使用Booset 1.62。我还没有找到此版本的类似错误报告。

    我一直试图解决这个问题超过一个星期。如果有人能帮助我,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

你能告诉我们一个自包含的例子吗?

我认为您基本上会遇到短读取,对于非成帧协议而言here。它甚至解释了为什么EOF是一个&#34;错误&#34;:

  

perfectly normal

     

流的结尾可能导致readasync_readread_untilasync_read_until函数违反合同。例如。由于EOF,N个字节的读取可能提前完成。   可以使用EOF错误来区分流的结尾和大小为0的成功读取。