From fe85de763e0e1376933f2fe1841ef1007d9fae0f Mon Sep 17 00:00:00 2001 From: Peter Thorson Date: Sun, 2 Feb 2014 18:12:30 -0600 Subject: [PATCH] Adds configurable SO_REUSEADDR option. references #311 --- changelog.md | 2 ++ test/transport/integration.cpp | 2 ++ websocketpp/transport/asio/endpoint.hpp | 24 +++++++++++++++++++++++- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index 495c55b18b..b7f772c7d7 100644 --- a/changelog.md +++ b/changelog.md @@ -11,6 +11,8 @@ HEAD - Feature: Adds the ability to pause reading on a connection. Paused connections will not read more data from their socket, allowing TCP flow control to work without blocking the main thread. +- Feature: Adds the ability to specify whether or not to use the `SO_REUSEADDR` TCP socket + option. The default for this value has been changed from `true` to `false`. - Improvement: Open, close, and pong timeouts can be disabled entirely by setting their duration to 0. - Improvement: Numerous performance improvements. Including: tuned default diff --git a/test/transport/integration.cpp b/test/transport/integration.cpp index d55c350dd4..a73738ac80 100644 --- a/test/transport/integration.cpp +++ b/test/transport/integration.cpp @@ -108,6 +108,7 @@ void run_server(server * s, int port, bool log = false) { } s->init_asio(); + s->set_reuse_addr(true); s->listen(port); s->start_accept(); @@ -124,6 +125,7 @@ void run_client(client & c, std::string uri, bool log = false) { } websocketpp::lib::error_code ec; c.init_asio(ec); + c.set_reuse_addr(true); BOOST_CHECK(!ec); client::connection_ptr con = c.get_connection(uri,ec); diff --git a/websocketpp/transport/asio/endpoint.hpp b/websocketpp/transport/asio/endpoint.hpp index d508e90312..7d007dd8f0 100644 --- a/websocketpp/transport/asio/endpoint.hpp +++ b/websocketpp/transport/asio/endpoint.hpp @@ -91,6 +91,7 @@ public: explicit endpoint() : m_external_io_service(false) , m_listen_backlog(0) + , m_reuse_addr(false) , m_state(UNINITIALIZED) { //std::cout << "transport::asio::endpoint constructor" << std::endl; @@ -123,6 +124,7 @@ public: , m_external_io_service(src.m_external_io_service) , m_acceptor(src.m_acceptor) , m_listen_backlog(0) + , m_reuse_addr(src.m_reuse_addr) , m_state(src.m_state) { src.m_io_service = NULL; @@ -137,6 +139,7 @@ public: m_external_io_service = rhs.m_external_io_service; m_acceptor = rhs.m_acceptor; m_listen_backlog = rhs.m_listen_backlog + m_reuse_addr = rhs.m_reuse_addr; m_state = rhs.m_state; rhs.m_io_service = NULL; @@ -287,6 +290,24 @@ public: void set_listen_backlog(int backlog) { m_listen_backlog = backlog; } + + /// Sets whether or not to use the SO_REUSEADDR flag when opening a listening socket + /** + * Specifies whether or not to use the SO_REUSEADDR TCP socket option. What this flag + * does depends on your operating system. Please consult operating system + * documentation for more details. + * + * New values affect future calls to listen only. + * + * The default is false. + * + * @since 0.4.0-alpha1 + * + * @param value Whether or not to use the SO_REUSEADDR option + */ + void set_reuse_addr(bool value) { + m_reuse_addr = value; + } /// Retrieve a reference to the endpoint's io_service /** @@ -324,7 +345,7 @@ public: m_alog->write(log::alevel::devel,"asio::listen"); m_acceptor->open(ep.protocol()); - m_acceptor->set_option(boost::asio::socket_base::reuse_address(true)); + m_acceptor->set_option(boost::asio::socket_base::reuse_address(m_reuse_addr)); m_acceptor->bind(ep); if (m_listen_backlog == 0) { m_acceptor->listen(); @@ -1024,6 +1045,7 @@ private: // Network constants int m_listen_backlog; + bool m_reuse_addr; elog_type* m_elog; alog_type* m_alog;