Index: Lib/asyncore.py =================================================================== --- Lib/asyncore.py (revisione 84998) +++ Lib/asyncore.py (copia locale) @@ -256,6 +256,7 @@ raise else: self.socket = None + self._accept_pair = None def __repr__(self): status = [self.__class__.__module__+"."+self.__class__.__name__] @@ -349,15 +350,19 @@ raise socket.error(err, errorcode[err]) def accept(self): - # XXX can return either an address pair or None - try: - conn, addr = self.socket.accept() - return conn, addr - except socket.error as why: - if why.args[0] == EWOULDBLOCK: - pass - else: - raise + if self._accept_pair: + ap = self._accept_pair + self._accept_pair = None + return ap + else: + try: + conn, addr = self.socket.accept() + return conn, addr + except socket.error as why: + if why.args[0] == EWOULDBLOCK: + pass + else: + raise def send(self, data): try: @@ -429,7 +434,7 @@ if self.accepting: # accepting sockets are never connected, they "spawn" new # sockets that are connected - self.handle_accept() + self.handle_accept_event() elif not self.connected: self.handle_connect_event() self.handle_read() @@ -443,6 +448,21 @@ self.handle_connect() self.connected = True + def handle_accept_event(self): + try: + sock, addr = self.accept() + except TypeError: + return + except socket.error as err: + if err[0] != errno.ECONNABORTED: + raise + return + else: + if addr == None: + return + self._accept_pair = sock, addr + self.handle_accept() + def handle_write_event(self): if self.accepting: # Accepting sockets shouldn't get a write event.