def handleAccept(self, rc, evt): if self.disconnecting or self.disconnected: return False # possible errors: # (WSAEMFILE, WSAENOBUFS, WSAENFILE, WSAENOMEM, WSAECONNABORTED) if rc: log.msg("Could not accept new connection -- %s (%s)" % (errno.errorcode.get(rc, 'unknown error'), rc)) return False else: evt.newskt.setsockopt(socket.SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, struct.pack('I', self.socket.fileno())) family, lAddr, rAddr = _iocp.get_accept_addrs(evt.newskt.fileno(), evt.buff) assert family == self.addressFamily protocol = self.factory.buildProtocol( address._ServerFactoryIPv4Address('TCP', rAddr[0], rAddr[1])) if protocol is None: evt.newskt.close() else: s = self.sessionno self.sessionno = s+1 transport = Server(evt.newskt, protocol, address.IPv4Address('TCP', rAddr[0], rAddr[1]), address.IPv4Address('TCP', lAddr[0], lAddr[1]), s, self.reactor) protocol.makeConnection(transport) return True
def fileDescriptorsReceived(self, fds, message): if len(fds) == 1: fd = fds[0] # Note that we hardcode IPv4 here! sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM) # PROBE: received fd; see porter.py self.debug("[fd %5d] (ts %f) received fd from %d, created socket", sock.fileno(), time.time(), fd) # Undocumentedly (other than a comment in # Python/Modules/socketmodule.c), socket.fromfd() calls dup() on # the passed FD before it actually wraps it in a socket object. # So, we need to close the FD that we originally had... os.close(fd) try: peeraddr = sock.getpeername() except socket.error: self.info("Socket disconnected before being passed to client") sock.close() return # Based on bits in tcp.Port.doRead() addr = address._ServerFactoryIPv4Address('TCP', peeraddr[0], peeraddr[1]) protocol = self.childFactory.buildProtocol(addr) self._connectionClass(sock, protocol, peeraddr, message) else: self.warning("Unexpected: FD-passing message with len(fds) != 1")
log.msg("%s starting on %s" % (self.factory.__class__, self._realPortNumber)) # The order of the next 6 lines is kind of bizarre. If no one # can explain it, perhaps we should re-arrange them. self.factory.doStart() skt.listen(self.backlog) self.connected = True self.socket = skt self.fileno = self.socket.fileno self.numberAccepts = 100 self.startReading() def _buildAddr(self, (host, port)): return address._ServerFactoryIPv4Address('TCP', host, port) def doRead(self): """Called when my socket is ready for reading. This accepts a connection and calls self.protocol() to handle the wire-level protocol. """ try: if platformType == "posix": numAccepts = self.numberAccepts else: # win32 event loop breaks if we do more than one accept() # in an iteration of the event loop. numAccepts = 1
def buildAddress(self, addr): return address._ServerFactoryIPv4Address('TCP', addr[0], addr[1], 'INET')