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_read
的EOF
错误。我已经浏览了以下帖子(以及其他一些类似的帖子),但没有任何帮助。
-
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
流的结束可能导致
read
、async_read
、read_until
或async_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 无限循环,接收数据为零字节