- Notifications
You must be signed in to change notification settings - Fork425
Description
Whenboost::network::http::server
is listening for new connections, it sometimes throws the following exception from it'srun()
method (orasio::io_service::run()
) when the host is being port scanned using nmap:
boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::system_error>>remote_endpoint: Transport endpoint is not connected
After the exception servers stops accepting connections even if event loop is restarted and has to bestop()
'ed and `listen()``ed again. In my tests, depending on the system, this may happen every time the host in nmap'ed or require several consequent nmaps.
This bug actually has already been reported (issue#360), but for an old version of cpp-netlib and there was no activity, so i decided to open a new issue. I am experiencing this problem with cpp-netlib 0.12.0.
I have fixed the issue in my project with the following patch. I am unsure if i have fixed it the right way (for example, i might have introduced breaking API change instream_handler::remote_endpoint()
), but if it is ok, i can send a pull request.
diff --git a/boost/network/protocol/http/server/async_connection.hpp b/boost/network/protocol/http/server/async_connection.hppindex 915c6fb..eca2f68 100644--- a/boost/network/protocol/http/server/async_connection.hpp+++ b/boost/network/protocol/http/server/async_connection.hpp@@ -462,11 +462,18 @@ struct async_connection enum state_t { method, uri, version, headers }; void start() {- typename ostringstream<Tag>::type ip_stream;- ip_stream << socket_.remote_endpoint().address().to_string() << ':'- << socket_.remote_endpoint().port();- request_.source = ip_stream.str();- read_more(method);+ std::error_code ec;+ auto remote_endpoint = socket_.remote_endpoint(ec);+ + if (ec) {+ error_encountered = in_place<std::system_error>(ec);+ } else {+ typename ostringstream<Tag>::type ip_stream;+ ip_stream << remote_endpoint.address().to_string() << ':'+ << remote_endpoint.port();+ request_.source = ip_stream.str();+ read_more(method);+ } } void read_more(state_t state) {diff --git a/boost/network/protocol/stream_handler.hpp b/boost/network/protocol/stream_handler.hppindex 16fafc6..9d82706 100644--- a/boost/network/protocol/stream_handler.hpp+++ b/boost/network/protocol/stream_handler.hpp@@ -109,11 +109,11 @@ struct stream_handler { } }- tcp_socket::endpoint_type remote_endpoint() const {+ tcp_socket::endpoint_type remote_endpoint(std::error_code& ec) const { if (ssl_enabled) {- return ssl_sock_->next_layer().remote_endpoint();+ return ssl_sock_->next_layer().remote_endpoint(ec); } else {- return tcp_sock_->remote_endpoint();+ return tcp_sock_->remote_endpoint(ec); } }