diff -r be23a662d709 -r b4b47c1a02ba src/eric7/RemoteServer/EricServer.py --- a/src/eric7/RemoteServer/EricServer.py Sun Feb 11 18:35:44 2024 +0100 +++ b/src/eric7/RemoteServer/EricServer.py Mon Feb 12 18:09:53 2024 +0100 @@ -68,13 +68,8 @@ # TODO: 'Project' handler not implemented yet # TODO: implement an 'EditorConfig' handler (?) - address = ("", port) - if socket.has_dualstack_ipv6() and useIPv6: - self.__socket = socket.create_server( - address, family=socket.AF_INET6, dualstack_ipv6=True - ) - else: - self.__socket = socket.create_server(address, family=socket.AF_INET) + self.__address = ("", port) + self.__useIPv6 = useIPv6 def getSelector(self): """ @@ -150,7 +145,7 @@ @rtype bytes """ data = bytearray() - while len(data) < length: + while sock is not None and len(data) < length: try: newData = sock.recv(length - len(data)) if not newData: @@ -264,6 +259,36 @@ ## Methods for the server main loop. ####################################################################### + def __initializeIdeSocket(self): + """ + Private method to initialize and register the eric-ide server socket. + """ + if socket.has_dualstack_ipv6() and self.__useIPv6: + self.__socket = socket.create_server( + self.__address, family=socket.AF_INET6, backlog=0, dualstack_ipv6=True + ) + else: + self.__socket = socket.create_server( + self.__address, family=socket.AF_INET, backlog=0 + ) + + self.__socket.listen(0) + self.__socket.setblocking(False) + print(f"Listening for 'eric-ide' connections on {self.__socket.getsockname()}") + data = types.SimpleNamespace( + name="server", acceptHandler=self.__acceptIdeConnection + ) + self.__selector.register(self.__socket, selectors.EVENT_READ, data=data) + + def __unregisterIdeSocket(self): + """ + Private method to unregister the eric-ide server socket because only one + connection is allowed. + """ + self.__selector.unregister(self.__socket) + self.__socket.shutdown(socket.SHUT_RDWR) + self.__socket.close() + def __shutdown(self): """ Private method to shut down the server. @@ -283,14 +308,23 @@ @param sock reference to the listening socket @type socket.socket """ - self.__connection, address = sock.accept() # Should be ready to read - print(f"'eric-ide' connection from {address[0]}, port {address[1]}") - self.__connection.setblocking(False) - data = types.SimpleNamespace( - name="eric-ide", address=address, handler=self.__serviceIdeConnection - ) - events = selectors.EVENT_READ - self.__selector.register(self.__connection, events, data=data) + connection, address = sock.accept() # Should be ready to read + if self.__connection is None: + print(f"'eric-ide' connection from {address[0]}, port {address[1]}") + self.__connection = connection + self.__connection.setblocking(False) + data = types.SimpleNamespace( + name="eric-ide", address=address, handler=self.__serviceIdeConnection + ) + events = selectors.EVENT_READ + self.__selector.register(self.__connection, events, data=data) + + self.__unregisterIdeSocket() + else: + print( + f"'eric-ide' connection from {address[0]}, port {address[1]} rejected" + ) + connection.close() def __closeIdeConnection(self): """ @@ -311,6 +345,8 @@ self.__debuggerRequestHandler.shutdownClients() + self.__initializeIdeSocket() + def __serviceIdeConnection(self, key): """ Private method to service the eric-ide connection. @@ -348,15 +384,10 @@ cleanExit = True self.__shouldStop = False - # listen on the server socket for new connections - self.__socket.listen(1) - self.__socket.setblocking(False) - print(f"Listening for 'eric-ide' connections on {self.__socket.getsockname()}") - data = types.SimpleNamespace( - name="server", acceptHandler=self.__acceptIdeConnection - ) - self.__selector.register(self.__socket, selectors.EVENT_READ, data=data) + # initialize the eric-ide server socket and listen for new connections + self.__initializeIdeSocket() + # initialize the debug client server socket self.__debuggerRequestHandler.initServerSocket() while True: