diff --git a/include/mqtt/server.hpp b/include/mqtt/server.hpp index 3a7f344f0..5e7bf2b68 100644 --- a/include/mqtt/server.hpp +++ b/include/mqtt/server.hpp @@ -84,9 +84,20 @@ class server { void listen() { close_request_ = false; renew_socket(); + if (!acceptor_) { - acceptor_.emplace(ios_accept_, ep_); - config_(acceptor_.value()); + try { + acceptor_.emplace(ios_accept_, ep_); + config_(acceptor_.value()); + } + catch (boost::system::system_error const& e) { + ios_accept_.post( + [this, ec = e.code()] { + if (h_error_) h_error_(ec); + } + ); + return; + } } do_accept(); } @@ -208,9 +219,20 @@ class server_tls { void listen() { close_request_ = false; renew_socket(); + if (!acceptor_) { - acceptor_.emplace(ios_accept_, ep_); - config_(acceptor_.value()); + try { + acceptor_.emplace(ios_accept_, ep_); + config_(acceptor_.value()); + } + catch (boost::system::system_error const& e) { + ios_accept_.post( + [this, ec = e.code()] { + if (h_error_) h_error_(ec); + } + ); + return; + } } do_accept(); } @@ -255,6 +277,7 @@ class server_tls { [this] (boost::system::error_code ec) { if (ec) { + acceptor_.reset(); if (h_error_) h_error_(ec); return; } @@ -355,9 +378,20 @@ class server_ws { void listen() { close_request_ = false; renew_socket(); + if (!acceptor_) { - acceptor_.emplace(ios_accept_, ep_); - config_(acceptor_.value()); + try { + acceptor_.emplace(ios_accept_, ep_); + config_(acceptor_.value()); + } + catch (boost::system::system_error const& e) { + ios_accept_.post( + [this, ec = e.code()] { + if (h_error_) h_error_(ec); + } + ); + return; + } } do_accept(); } @@ -519,9 +553,20 @@ class server_tls_ws { void listen() { close_request_ = false; renew_socket(); + if (!acceptor_) { - acceptor_.emplace(ios_accept_, ep_); - config_(acceptor_.value()); + try { + acceptor_.emplace(ios_accept_, ep_); + config_(acceptor_.value()); + } + catch (boost::system::system_error const& e) { + ios_accept_.post( + [this, ec = e.code()] { + if (h_error_) h_error_(ec); + } + ); + return; + } } do_accept(); }