gpt4 book ai didi

c++ - 在 boost::asio 中自定义套接字/关闭系统调用

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

我有一个使用 boost::asio 与 TCP 和 UDP 套接字通信的库。这个库是跨平台的,并通过回调将一些操作委托(delegate)给使用它的应用程序。对于套接字,必须发生以下情况:

  1. 图书馆打开套接字(用于出站连接)。
  2. 应用程序收到一个允许它自定义行为的回调
  3. 库连接一个套接字并使用它
  4. 应用程序收到回调,允许它进行任何必要的清理
  5. 库关闭套接字

以下是我认为我可以实现这一目标的方法:

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 实际关闭套接字之前通知我关闭套接字?

最佳答案

ASIO 有一个名为 handler tracking 的调试功能.

你可以用它来拦截 socket closures被调用为:

  BOOST_ASIO_HANDLER_OPERATION((reactor_.context(), "socket", &impl, impl.socket_, "close"));

只需#define BOOST_ASIO_HANDLER_OPERATION(...) 到您想要调用的任何函数,并在其中检查 arg 5 == "close"

这是一个 example如何使用处理程序跟踪。

供引用:实际的close()操作是not straightforward .最好保持原样。

关于c++ - 在 boost::asio 中自定义套接字/关闭系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56325047/

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