예제 #1
0
    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'))
예제 #2
0
 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
예제 #3
0
 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)]
예제 #4
0
파일: tcp.py 프로젝트: jaimematsuda/BolsaVL
    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)
예제 #5
0
    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