Exemple #1
0
    def readDataFromFD(self, fd):
        length = 0

        while True:
            try:
                data = fd.recv(8192)
                if len(data) == 0:
                    # Disconnect
                    return 0

                if fd in self.connMap:
                    try:
                        self.connMap[fd][0].handleRead(data)
                    except Exception as e:
                        NNLogger.logConnection("[ERROR] Handle read data from client (%s:%d) error:%s | %s" % (self.connMap[fd][2], self.connMap[fd][3], e, traceback.format_exc()))
                        return NNError.TCP_DATA_HANDLE_ERROR

                    length += len(data)
                else:
                    # Internal error
                    NNLogger.logConnection("[ERROR] Read FD not in cache")
                    return NNError.TCP_DATA_HANDLE_ERROR
            except socket.error as e:
                if e.errno == errno.EWOULDBLOCK:
                    # Read done
                    return length
                else:
                    # Other read error
                    return NNError.TCP_SOCK_READ_ERROR
Exemple #2
0
    def loop(self):
        rlist = [self.serverSocket]
        wlist = [self.serverSocket]

        while True:
            readFD, writeFD, exceptFD = select.select(rlist, wlist, []);
            for fd in readFD:
                if fd == self.serverSocket:
                    sock, (addr, port) = self.serverSocket.accept()
                    sock.setblocking(0)

                    try:
                        self.connMap[sock] = (self.connClass(sock, addr, port), sock, addr, port)
                        rlist.append(sock)
                        wlist.append(sock)
                    except Exception as e:
                        NNLogger.logConnection("[ERROR] Create instance of connection class [%s] error:%s" % (connClass, e))
                        sock.close()
                else:
                    connection = self.connMap[fd][0]
                    ret = self.readDataFromFD(fd)
                    if ret <= 0:
                        connection.handleClose(ret)
                        fd.close()
                        rlist.remove(fd)
                        wlist.remove(fd)
                        writeFD.remove(fd)
                        del self.connMap[fd]
                    else:
                        if len(connection.sendBuffer) > 0:
                            writeLen = self.writeDataToFD(fd, connection.sendBuffer)
                            if writeLen < 0:
                                connection.handleClose(ret)
                                fd.close()
                                rlist.remove(fd)
                                wlist.remove(fd)
                                writeFD.remove(fd)
                                del self.connMap[fd]
                            else:
                                self.sendBuffer = self.sendBuffer[writeLen:]
                                wlist.append(fd)

            for fd in writeFD:
                connection = self.connMap[fd][0]
                connection.handleWrite()
                if len(connection.sendBuffer) == 0:
                    wlist.remove(connection.socket)
Exemple #3
0
 def handleClose(self, errCode):
     NNLogger.logConnection("[CLOSE] %s:%d %d" % (self.peerAddr, self.peerPort, errCode))
Exemple #4
0
 def handleAccept(self):
     NNLogger.logConnection("[ACCEPT] %s:%d" % (self.peerAddr, self.peerPort))