【发布时间】:2019-10-12 23:15:48
【问题描述】:
我有一个库,它使用boost::asio 与 TCP 和 UDP 套接字进行通信。这个库是跨平台的,并通过回调将一些操作委托给使用它的应用程序。在套接字的情况下,必须发生以下情况:
- 库打开一个套接字(用于出站连接)。
- 应用程序接收到允许其自定义行为的回调
- 库连接套接字并使用它
- 应用程序收到一个回调,允许它进行任何必要的清理
- 库关闭套接字
以下是我认为我可以实现的方法:
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 实际执行之前?
【问题讨论】:
-
我建议彻底阅读文档。 stackoverflow.com/questions/818665/… 可能会有所帮助。
标签: c++ sockets boost boost-asio