gpt4 book ai didi

c++ - boost::asio 错误 "The I/O operation has been aborted..."

转载 作者:行者123 更新时间:2023-11-30 04:36:25 24 4
gpt4 key购买 nike

我收到此错误消息

“由于线程退出或应用程序请求,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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com