【问题标题】:Customising socket/close syscalls in boost::asio在 boost::asio 中自定义套接字/关闭系统调用
【发布时间】:2019-10-12 23:15:48
【问题描述】:

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

  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 实际执行之前?

【问题讨论】:

标签: c++ sockets boost boost-asio


【解决方案1】:

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。最好保持原样。

【讨论】:

  • 谢谢,到目前为止,这似乎正是我所需要的!警告其他任何人这样做:它改变了boost/asio 中事物的类层次结构 - 使用-DBOOST_ASIO_CUSTOM_HANDLER_TRACKING="myheader.hpp" 定义宏,否则在包含之前没有定义该宏的任何地方都会导致内存损坏提升。
猜你喜欢
  • 2016-10-27
  • 1970-01-01
  • 2016-05-25
  • 2013-02-25
  • 1970-01-01
  • 2019-10-21
  • 2011-10-15
  • 2011-12-05
  • 2012-01-16
相关资源
最近更新 更多