diff --git a/src/tcpsockets/TCPAcceptor.cpp b/src/tcpsockets/TCPAcceptor.cpp index a63f5a2f62..607e428537 100644 --- a/src/tcpsockets/TCPAcceptor.cpp +++ b/src/tcpsockets/TCPAcceptor.cpp @@ -30,10 +30,15 @@ #include TCPAcceptor::TCPAcceptor(int port, const char* address) - : m_lsd(0), m_port(port), m_address(address), m_listening(false) {} + : m_lsd(0), + m_port(port), + m_address(address), + m_listening(false), + m_shutdown(false) {} TCPAcceptor::~TCPAcceptor() { if (m_lsd > 0) { + shutdown(); close(m_lsd); } } @@ -71,6 +76,11 @@ int TCPAcceptor::start() { return result; } +void TCPAcceptor::shutdown() { + m_shutdown = true; + ::shutdown(m_lsd, SHUT_RDWR); +} + std::unique_ptr TCPAcceptor::accept() { if (!m_listening) return nullptr; @@ -79,7 +89,7 @@ std::unique_ptr TCPAcceptor::accept() { std::memset(&address, 0, sizeof(address)); int sd = ::accept(m_lsd, (struct sockaddr*)&address, &len); if (sd < 0) { - perror("accept() failed"); + if (!m_shutdown) perror("accept() failed"); return nullptr; } return std::unique_ptr(new TCPStream(sd, &address)); diff --git a/src/tcpsockets/TCPAcceptor.h b/src/tcpsockets/TCPAcceptor.h index c0fddf67f8..dbb9dcc8c2 100644 --- a/src/tcpsockets/TCPAcceptor.h +++ b/src/tcpsockets/TCPAcceptor.h @@ -34,12 +34,14 @@ class TCPAcceptor { int m_port; std::string m_address; bool m_listening; + bool m_shutdown; public: TCPAcceptor(int port, const char* address); ~TCPAcceptor(); int start(); + void shutdown(); std::unique_ptr accept(); private: