Настройка сокета / закрытия системных вызовов в boost :: asio - PullRequest
1 голос
/ 27 мая 2019

У меня есть библиотека, которая взаимодействует с сокетами TCP и UDP, используя boost::asio.Эта библиотека является кроссплатформенной и делегирует некоторые операции приложению с помощью обратных вызовов.В случае сокетов должно произойти следующее:

  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 это делает?

1 Ответ

1 голос
/ 27 мая 2019

ASIO имеет функцию отладки под названием отслеживание обработчика .

. Вы можете использовать его для перехвата закрытия сокетов , которые вызываются как:

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

Просто #define BOOST_ASIO_HANDLER_OPERATION(...) для любой функции, которую вы хотите вызвать, и там проверьте, что arg 5 == "close".

Вот пример того, как использовать отслеживание обработчиков.

Для справки: фактическая close() операция не прямолинейна .Лучше оставить все как есть.

...