From 77ce84ca0a6c4129f1c85f9bdff056c95da02cfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Vuchener?= Date: Sun, 19 Nov 2023 14:46:14 +0100 Subject: [PATCH] Improve Accept error handling in RemoteServer Also makes sure the socket is blocking to avoid EWOULDBLOCK errors. --- library/RemoteServer.cpp | 39 ++++++++++++++++----------------------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/library/RemoteServer.cpp b/library/RemoteServer.cpp index 72f2a29b5..192ead947 100644 --- a/library/RemoteServer.cpp +++ b/library/RemoteServer.cpp @@ -475,35 +475,28 @@ void ServerMainImpl::threadFn(std::promise promise, int port) { ServerMainImpl server{std::move(promise), port}; - CActiveSocket *client = nullptr; - + server.socket.SetBlocking(); try { - for (int acceptFail = 0 ; server.socket.IsSocketValid() && acceptFail < 5 ; acceptFail++) - { - if ((client = server.socket.Accept()) != NULL) - { + while (server.socket.IsSocketValid()) { + if (std::unique_ptr client{server.socket.Accept()}) { BlockGuard lock; - ServerConnection::Accepted(client); - client = nullptr; + ServerConnection::Accepted(client.release()); } - else - { - WARN(socket).print("Connection failure: %s (%d of %d)\n", server.socket.DescribeError(), acceptFail + 1, 5); + else switch (server.socket.GetSocketError()) { + case CSimpleSocket::SocketInvalidSocket: + WARN(socket).print("Listening socket invalid, shutting down RemoteServer\n"); + server.socket.Close(); + break; + case CSimpleSocket::SocketFirewallError: + case CSimpleSocket::SocketProtocolError: + WARN(socket).print("Connection failed: %s\n", server.socket.DescribeError()); + break; + default: + break; } } - } catch(BlockedException &) { - if (client) - client->Close(); - delete client; - } - - if (server.socket.IsSocketValid()) - { - WARN(socket).print("Too many failed accepts, shutting down RemoteServer\n"); } - else - { - WARN(socket).print("Listening socket invalid, shutting down RemoteServer\n"); + catch(BlockedException &) { } }