c++ - 在 boost::asio 中自定义套接字/关闭系统调用
问题描述
我有一个库,它使用boost::asio
. 这个库是跨平台的,并通过回调将一些操作委托给使用它的应用程序。在套接字的情况下,必须发生以下情况:
- 库打开一个套接字(用于出站连接)。
- 应用程序接收到一个允许它自定义行为的回调
- 库连接一个套接字并使用它
- 应用程序收到一个回调,允许它进行任何必要的清理
- 库关闭套接字
以下是我认为我可以实现这一目标的方式:
class CustomizableTcpSocket {
public:
template <typename T, typename U>
auto async_connect(T&& endpoint, U&& handler) {
boost::system::error_code ec;
socket_.open(endpoint.protocol(), ec);
native_code_.socket_did_open(socket_.native_handle());
return socket_.async_connect(std::forward<U>(handler));
}
// same for async_write_some as well
template <typename... Args>
auto async_read_some(Args&&... args) {
return socket_.async_read_some(std::forward<Args>(args)...);
}
~CustomizableTcpSocket() {
if (socket_.is_open()) {
native_code_.socket_will_close(socket_.native_handle());
}
}
private:
NativeCode native_code_;
boost::asio::ip::tcp::socket socket_;
};
我发现 asio 有时会在我的析构函数触发之前关闭套接字(在操作系统级别)。
有没有办法在 asio 实际执行之前通知我套接字关闭?
解决方案
推荐阅读
- symfony - 动态表单修改
- java - 自动化状态复选框以验证活动/非活动
- android - 通过 firebase 使用 Microsoft 帐户进行身份验证
- java - 计算整数位
- android - 三星 S10、S21Ultra 中的 WebRTC 回声问题
- popup - Openlayers:格式化弹出map.popup.feature
- flutter - 颤动如何检测是否嵌入网络
- java - 打开的文件太多,我的文件处理是否正确?
- mongodb - 使用 Spring 数据在 MongoDB 中获取基于 DBRef 的 Embed Document
- javascript - 如何清除我的 chrome 扩展的 storage.sync?