diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py index 7eb55bd63ddb73..d4320772e10064 100644 --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -858,6 +858,8 @@ def loop(f=None): if self.is_closed(): return f = self._proactor.accept(sock) + except ConnectionResetError: + self.call_soon(loop) except OSError as exc: if sock.fileno() != -1: self.call_exception_handler({ diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py index bf99bc271c7acd..84f4bbdc45fb9c 100644 --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -553,7 +553,16 @@ def accept(self, listener): ov.AcceptEx(listener.fileno(), conn.fileno()) def finish_accept(trans, key, ov): - ov.getresult() + try: + ov.getresult() + except OSError as exc: + # If ERROR_NETNAME_DELETED or ERROR_OPERATION_ABORTED occur, + # do not close the serving socket. + if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED, + _overlapped.ERROR_OPERATION_ABORTED): + conn.close() + raise ConnectionResetError(*exc.args) + raise # Use SO_UPDATE_ACCEPT_CONTEXT so getsockname() etc work. buf = struct.pack('@P', listener.fileno()) conn.setsockopt(socket.SOL_SOCKET,