def __init__(self, port, proto, interface='', maxPacketSize=8192, reactor=None): """ Initialize with a numeric port to listen on. """ self.port = port self.protocol = proto self.readBufferSize = maxPacketSize self.interface = interface self.setLogStr() self._connectedAddr = None self._setAddressFamily() abstract.FileHandle.__init__(self, reactor) skt = socket.socket(self.addressFamily, self.socketType) addrLen = _iocp.maxAddrLen(skt.fileno()) self.addressBuffer = _iocp.AllocateReadBuffer(addrLen) # WSARecvFrom takes an int self.addressLengthBuffer = _iocp.AllocateReadBuffer( struct.calcsize('i'))
def _dispatchData(self): """ Dispatch previously read data. Return True if self.reading and we don't have any more data """ if not self._readSize: return self.reading size = self._readSize full_buffers = size // self.readBufferSize while self._readNextBuffer < full_buffers: self.dataReceived(self._readBuffers[self._readNextBuffer]) self._readNextBuffer += 1 if not self.reading: return False remainder = size % self.readBufferSize if remainder: self.dataReceived( buffer(self._readBuffers[full_buffers], 0, remainder)) if self.dynamicReadBuffers: total_buffer_size = self.readBufferSize * len(self._readBuffers) # we have one buffer too many if size < total_buffer_size - self.readBufferSize: del self._readBuffers[-1] # we filled all buffers, so allocate one more elif (size == total_buffer_size and len(self._readBuffers) < self.maxReadBuffers): self._readBuffers.append( _iocp.AllocateReadBuffer(self.readBufferSize)) self._readNextBuffer = 0 self._readSize = 0 return self.reading
def __init__(self, reactor=None): if not reactor: from twisted.internet import reactor self.reactor = reactor self._tempDataBuffer = [] # will be added to dataBuffer in doWrite self._tempDataLen = 0 self._readBuffers = [_iocp.AllocateReadBuffer(self.readBufferSize)]
def doAccept(self): evt = _iocp.Event(self.cbAccept, self) # see AcceptEx documentation evt.buff = buff = _iocp.AllocateReadBuffer(2 * (self.addrLen + 16)) evt.newskt = newskt = self.reactor.createSocket(self.addressFamily, self.socketType) rc = _iocp.accept(self.socket.fileno(), newskt.fileno(), buff, evt) if rc and rc != ERROR_IO_PENDING: self.handleAccept(rc, evt)
def doAccept(self): numAccepts = 0 while 1: evt = _iocp.Event(self.cbAccept, self) # see AcceptEx documentation evt.buff = buff = _iocp.AllocateReadBuffer(2 * (self.addrLen + 16)) evt.newskt = newskt = self.reactor.createSocket( self.addressFamily, self.socketType) rc = _iocp.accept(self.socket.fileno(), newskt.fileno(), buff, evt) if (rc == ERROR_IO_PENDING or (not rc and numAccepts >= self.maxAccepts)): break else: evt.ignore = True if not self.handleAccept(rc, evt): break numAccepts += 1