我从EOF
收到boost::asio::async_read
错误。我已经浏览了以下帖子(以及其他一些类似的帖子)并没有帮助我。
关于我的应用程序:我开发了一个WebBrowser(使用IE WebBrowser控件)和浏览器通信的代理服务器。没有什么可以在浏览器中检查,因为IE引擎内部发生了一切。在代理服务器中,我随EOF
以及任何其他阅读版本(async_read
,async_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。我还没有找到此版本的类似错误报告。
我一直试图解决这个问题超过一个星期。如果有人能帮助我,我将不胜感激。
答案 0 :(得分:1)
你能告诉我们一个自包含的例子吗?
我认为您基本上会遇到短读取,对于非成帧协议而言here。它甚至解释了为什么EOF是一个&#34;错误&#34;:
perfectly normal
流的结尾可能导致
read
,async_read
,read_until
或async_read_until
函数违反合同。例如。由于EOF
,N个字节的读取可能提前完成。 可以使用EOF
错误来区分流的结尾和大小为0的成功读取。