У меня есть библиотека, которая взаимодействует с сокетами TCP и UDP, используя 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 это делает?