diff --git a/Userland/Libraries/LibCore/TCPServer.cpp b/Userland/Libraries/LibCore/TCPServer.cpp index 1402a001a1..26fa624d1a 100644 --- a/Userland/Libraries/LibCore/TCPServer.cpp +++ b/Userland/Libraries/LibCore/TCPServer.cpp @@ -39,13 +39,19 @@ TCPServer::~TCPServer() MUST(Core::System::close(m_fd)); } -ErrorOr TCPServer::listen(IPv4Address const& address, u16 port) +ErrorOr TCPServer::listen(IPv4Address const& address, u16 port, AllowAddressReuse allow_address_reuse) { if (m_listening) return Error::from_errno(EADDRINUSE); auto socket_address = SocketAddress(address, port); auto in = socket_address.to_sockaddr_in(); + + if (allow_address_reuse == AllowAddressReuse::Yes) { + int option = 1; + TRY(Core::System::setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option))); + } + TRY(Core::System::bind(m_fd, (sockaddr const*)&in, sizeof(in))); TRY(Core::System::listen(m_fd, 5)); m_listening = true; diff --git a/Userland/Libraries/LibCore/TCPServer.h b/Userland/Libraries/LibCore/TCPServer.h index d2357ec188..3af4141bcc 100644 --- a/Userland/Libraries/LibCore/TCPServer.h +++ b/Userland/Libraries/LibCore/TCPServer.h @@ -20,8 +20,13 @@ public: static ErrorOr> try_create(Object* parent = nullptr); virtual ~TCPServer() override; + enum class AllowAddressReuse { + Yes, + No, + }; + bool is_listening() const { return m_listening; } - ErrorOr listen(IPv4Address const& address, u16 port); + ErrorOr listen(IPv4Address const& address, u16 port, AllowAddressReuse = AllowAddressReuse::No); ErrorOr set_blocking(bool blocking); ErrorOr> accept();