- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我收到此错误消息
“由于线程退出或应用程序请求,I/O 操作已中止”
当使用 boost::asio::socket::async_read_some() 时
错误是什么意思?我应该寻找什么?
相关代码如下:
void tcp_connection::start()
{
printf("Connected to simulator\n");
socket_.async_read_some(boost::asio::buffer(myBuffer,256),
boost::bind(&tcp_connection::read_sim_handler,this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void tcp_connection::read_sim_handler(
const boost::system::error_code& error, // Result of operation.
std::size_t len ) // Number of bytes read.
{
try {
if (error == boost::asio::error::eof) {
// Connection closed cleanly by peer.
printf("Sim connection closed\n");
return;
} else if (error) {
throw boost::system::system_error(error); // Some other error. if( ! error )
}
socket_.async_read_some(boost::asio::buffer(myBuffer,256),
boost::bind(&tcp_connection::read_sim_handler,this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
}
当我在 start() 方法中用 read_some() 替换对 async_read_some() 的调用时,一切正常(除了服务器阻塞等待消息!)
根据评论,我看到 tcp_connection 超出了范围。我从 http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/tutorial/tutdaytime3.html 复制了代码 上面写着:“我们将使用 shared_ptr 和 enable_shared_from_this,因为只要有引用它的操作,我们就希望使 tcp_connection 对象保持事件状态。”我承认我不知道那是什么意思。所以我以某种方式破坏了它?
经过进一步的评论,答案是
void tcp_connection::start()
{
printf("Connected to simulator\n");
socket_.async_read_some(boost::asio::buffer(myBuffer,256),
boost::bind(&tcp_connection::read_sim_handler,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
传递 shared_from_this() 而不是 this 使用了由服务器代码建立的聪明(太聪明?)保持事件基础设施,即使连接管理器不在范围内,通过正常方式。有关技术细节,请参阅已接受答案下的评论。
最佳答案
您的 tcp_connection
对象或您的缓冲区对象可能在异步操作完成之前超出范围。
既然您的程序是基于其中一个教程示例,为什么不查看另一个也读取一些数据的示例:http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/echo/async_tcp_echo_server.cpp
您的类超出范围的原因是您不再使用 shared_from_this()
。它所做的是为您的类创建一个 shared_ptr
并由绑定(bind)处理程序存储。这意味着 shared_ptr
将使您的类保持事件状态,直到您的处理程序被调用。
这也是为什么你需要继承enable_shared_from_this
。
超出范围的最后一个 shared_ptr
将删除您的类实例。
关于c++ - boost::asio 错误 "The I/O operation has been aborted...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4619502/
我是一名优秀的程序员,十分优秀!