boost asio async_read中的随机EOF

Posted

技术标签:

【中文标题】boost asio async_read中的随机EOF【英文标题】:Random EOF in boost asio async_read 【发布时间】:2016-12-28 15:27:31 【问题描述】:

我收到来自boost::asio::async_readEOF 错误。我已经浏览了以下帖子(以及其他一些类似的帖子),但没有任何帮助。

    EOF in async_read() in boost::asio Random EOF in boost asio in multi thread EOF in boost::async_read with thread_pull and boost 1.54

关于我的应用程序:我开发了一个 WebBrowser(使用 IE WebBrowser 控件)和与浏览器通信的代理服务器。由于一切都在 IE 引擎内部发生,因此无法在浏览器中检查任何内容。在代理服务器中,async_read 和任何其他读取版本(async_read_some()read())随机出现EOF 错误。这个问题我只在发布版本中遇到,而不是在调试版本中(至少现在还没有)。在调试版本中一切正常。

以下是我的阅读功能。我不知道是否有任何比赛条件或我遗漏的任何东西。

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() 函数。我不知道这有什么不同。

在 boost 1.54 中也有这个 bug 导致了类似的问题。但那是 3 年前的事了,现在已经修好了。目前,我使用的是Booset 1.62。我没有发现任何与此版本类似的错误报告。

我已经尝试解决这个问题一个多星期了。如果有人现在可以帮助我,将不胜感激。

【问题讨论】:

【参考方案1】:

你能给我们展示一个独立的例子吗?

我认为您基本上遇到了短读,即perfectly normal 用于非框架协议。它甚至解释了为什么 EOF 是一个“错误”:

Why EOF is an Error

流的结束可能导致readasync_readread_untilasync_read_until 函数违反它们的约定。例如。由于EOF,读取 N 字节可能会提前完成。 EOF 错误可用于区分流的结尾和大小为 0 的成功读取。

【讨论】:

在自包含的例子中,你想要小的运行代码?我会尝试修剪我的代码。我也尝试过使用async_read_some。有了这个,我也得到了EOF。不确定上述情况“为什么 EOF 是错误”是否适用! 百万分之一的读取出现EOF错误是否正常?它发生在我的应用程序运行 8-10 小时后,每秒读取和写入 6-7 个数据包。但后来我也不知道该怎么处理。听起来如果我是客户,我应该尝试重新连接?查看您提供的链接上的官方文档,听起来我可以忽略并继续下一个阅读?

以上是关于boost asio async_read中的随机EOF的主要内容,如果未能解决你的问题,请参考以下文章

Boost::asio::async_read 不会在条件下停止

优雅地取消 boost::asio::async_read

boost::asio::async_read 不回调我的处理函数

boost::asio::async_read 无限循环,接收数据为零字节

如何在到达终止字符时返回 boost::asio::async_read

boost::asio::async_read 在接收到完整的 Content-Length 之前接收 EOF