Beispiel #1
0
    def run(self):
        try:
            self.lock.acquire()
            while not self.shouldStop:
                self.lock.release()
                recvable, sendable, errored = self.samSockManager.select(
                    self.connsWithRecvInterest, self.connsWithSendInterest, self.allConns, timeout=1
                )
                self.lock.acquire()

                for connId in errored:
                    # conn failed, close it
                    self._failedConn(connId, "connection failed")

                for connId in sendable:
                    if connId in self.conns:
                        # connected
                        connSet = self.conns[connId]
                        torrentInfo = self.torrents[connSet["torrentIdent"]]
                        connSet["sock"].send(Messages.generateHandshake(torrentInfo["infohash"], self.peerId))
                        self.connsWithSendInterest.remove(connId)
                        self.connsWithRecvInterest.add(connId)

                for connId in recvable:
                    if connId in self.conns:
                        # received data
                        self._recvFromConn(connId)

            self.thread = None
            self.log.info("Stopping")
            self.lock.release()
        except:
            self.log.error("Error in main loop:\n%s", logTraceback())
 def _gotShortHandshake(self, connId, connSet):
     success = False
     data = ''.join(connSet['inBuffer'])
     connSet['inBuffer'] = [data]
     
     #decode handshake
     length, proto, reserved, infohash = Messages.decodeShortHandshake(data)
     
     if not proto.lower()=='bittorrent protocol':
         #invalid handshake, close conn
         self._closeConn(connId, 'received invalid handshake')
         
     elif not infohash in self.torrents:
         #invalid handshake, close conn
         self._closeConn(connId, 'received handshake with unknown infohash')
         
     else:
         #valid handshake
         connSet['torrentIdent'] = self.torrents[infohash]
         if self.peerPool.establishedConnection(connSet['torrentIdent'], connSet['sock'].getpeername()):
             #no connection to this address exists up to now
             success = True
             connSet['added'] = True
             self.log.info("Conn %d: Got valid handshake, sending response", connId)
             connSet['sock'].send(Messages.generateHandshake(infohash, self.peerId))
             
         else:
             #we already have a connection to this address
             self._closeConn(connId, 'we already have a connection to this address')
     
     return success