如何正确的终止asio socket的异步接收程序,请写出详细例子
时间: 2024-11-12 14:35:54 浏览: 65
在Asio (Boost.Asio) 中,正确终止异步socket接收通常涉及取消正在进行的操作并释放资源。以下是一个简单的例子,展示了如何在C++中使用Asio库来处理一个异步接收操作,并提供优雅的方式来停止它:
```cpp
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
class SocketHandler {
public:
std::shared_ptr<boost::asio::ip::tcp::socket> socket;
std::function<void(const boost::system::error_code&)> on_data_received;
// 初始化socket并开始接收数据
void start_receiving() {
socket->async_read_some(boost::asio::buffer(received_buffer), [this](auto error) {
if (!error && !received_buffer.empty()) {
// 如果没有错误并且有数据接收,继续处理数据
on_data_received(error);
start_receiving();
} else {
// 没有数据或遇到错误,关闭连接并停止接收
handle_error(error);
}
});
}
private:
void handle_error(const boost::system::error_code& e) {
if (!e) {
// 如果没有错误,可能是网络断开或主动关闭,我们也可以选择在这里手动关闭socket
socket->close();
} else {
// 如果有错误,打印日志并关闭socket
std::cerr << "Error receiving data: " << e.message() << '\n';
socket->close();
}
}
// 预设的缓冲区用于存储接收到的数据
char received_buffer[4096];
};
int main() {
try {
auto context = boost::asio::io_context{};
// 创建一个新的SocketHandler实例并初始化socket
SocketHandler handler;
boost::asio::ip::tcp::socket socket(context);
handler.socket = std::make_shared<socket>(context);
// 设置回调函数来处理接收到的数据
handler.on_data_received = [](const boost::system::error_code&) { /* process the received data */ };
// 开始接收数据
handler.start_receiving();
// 程序主循环,如果需要,可以在此处添加其他IO操作或者阻塞等待特定事件
context.run();
// 当程序退出时,handler的start_receiving方法不会被自动调用,所以这里不需要额外处理
} catch (std::exception& e) {
std::cerr << "Error: " << e.what() << '\n';
}
return 0;
}
```
在这个例子中,当需要停止接收时,你可以通过设置`on_data_received`回调为空或者在`handle_error`函数中直接关闭socket来实现。记住,Asio的异步操作会在操作完成或发生错误时自动调用回调,因此不需要显式地停止它们。当你不再需要socket服务时,确保关闭socket释放所有相关的系统资源。
阅读全文