Exemplo n.º 1
0
    def __init__(self, syncObj, nodeAddr, shouldConnect = None):
        self.__syncObj = weakref.ref(syncObj)
        self.__nodeAddr = nodeAddr

        if shouldConnect is not None:
            self.__shouldConnect = shouldConnect
        else:
            self.__shouldConnect = syncObj._getSelfNodeAddr() > nodeAddr

        self.__encryptor = syncObj._getEncryptor()
        self.__conn = None

        if self.__shouldConnect:
            self.__ip = globalDnsResolver().resolve(nodeAddr.split(':')[0])
            self.__port = int(nodeAddr.split(':')[1])
            self.__conn = TcpConnection(poller=syncObj._poller,
                                        onConnected=self.__onConnected,
                                        onMessageReceived=self.__onMessageReceived,
                                        onDisconnected=self.__onDisconnected,
                                        timeout=syncObj._getConf().connectionTimeout,
                                        sendBufferSize=syncObj._getConf().sendBufferSize,
                                        recvBufferSize=syncObj._getConf().recvBufferSize)
            self.__conn.encryptor = self.__encryptor

        self.__lastConnectAttemptTime = 0
        self.__lastPingTime = 0
        self.__status = NODE_STATUS.DISCONNECTED
        self.__terminating = False
Exemplo n.º 2
0
    def __onNewConnection(self, descr, event):
        if event & POLL_EVENT_TYPE.READ:
            try:
                sock, addr = self.__socket.accept()
                sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF,
                                self.__sendBufferSize)
                sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF,
                                self.__recvBufferSize)
                sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
                sock.setblocking(0)
                conn = TcpConnection(poller=self.__poller,
                                     socket=sock,
                                     timeout=self.__connectionTimeout,
                                     sendBufferSize=self.__sendBufferSize,
                                     recvBufferSize=self.__recvBufferSize)
                self.__onNewConnectionCallback(conn)
            except socket.error as e:
                if e.errno not in (socket.errno.EAGAIN,
                                   socket.errno.EWOULDBLOCK):
                    self.unbind()
                    return

        if event & POLL_EVENT_TYPE.ERROR:
            self.unbind()
            return
Exemplo n.º 3
0
    def add_peers(self, message_body):
        for peer_data in message_body.values():
            try:
                if peer_data['id'] != self.my_id and peer_data[
                        'id'] not in self.peers:
                    tcp_connection = TcpConnection()
                    tcp_connection.connect(peer_data['ip'], peer_data['port'])
                    tcp_connection.send(
                        (19).to_bytes(CODE_SIZE, byteorder='big') +
                        (self.info_hash + self.my_id).encode('utf-8'))

                    if int.from_bytes(tcp_connection.receive(),
                                      byteorder='big') == 11:
                        peer = Peer.start(peer_data['id'], tcp_connection,
                                          self.actor_ref, self.file_object,
                                          self.pieces_map)
                        self.peers[peer_data['id']] = {
                            'actor_ref': peer,
                            'downloaded_bytes': 0,
                            'state': 'not_interested'
                        }
                        print(
                            colored(
                                f"added new peer with id: {peer_data['id']}",
                                'yellow'))
                        if len(self.peers) == 1:
                            self.timer = Timer(TIMER_INTERVAL, self.actor_ref)
                            self.timer.daemon = True
                            self.timer.start()
            except:
                pass
Exemplo n.º 4
0
    def __init__(self, args):

        self.__result = None

        if self.__getData(args):
            self.__poller = createPoller('auto')
            self.__connection = TcpConnection(
                self.__poller,
                onDisconnected=self.__onDisconnected,
                onMessageReceived=self.__onMessageReceived,
                onConnected=self.__onConnected)
            if self.__password is not None:
                self.__connection.encryptor = getEncryptor(self.__password)
            self.__isConnected = self.__connection.connect(
                self.__host, self.__port)
            if not self.__isConnected:
                self.__result = 'can\'t connected'
            while self.__isConnected:
                self.__poller.poll(0.5)
Exemplo n.º 5
0
 def loop(self, sub_reactors):
     self.__is_looping = True
     logger.simple_log('正在接受玩家连接')
     while self.__is_looping:
         try:
             events = self.__epoll.poll(10)
             if not events:
                 logger.simple_log('暂时没有新玩家连接')
                 continue
             # 有玩家连接
             for i in range(len(events)):
                 client_sock, client_addr = self.__acceptor.accept()
                 new_conn = TcpConnection(client_sock)
                 new_conn.handle_connection_callback()
                 sub_reactors.assign_new_conn(new_conn)
         except IOError as error:
             if error.errno == errno.EINTR:
                 continue
     pass
Exemplo n.º 6
0
    def run(self):
        while True:
            try:
                client_socket, address = self.server_socket.accept()
                print(f"Connection from {address} has been established!")
                tcp_connection = TcpConnection(client_socket)
                status, peer_id = self.handle_request(tcp_connection)

                if status is True:
                    tcp_connection.send((11).to_bytes(CODE_SIZE,
                                                      byteorder='big'))
                    self.main_controller.tell({
                        'header': 8,
                        'body': (peer_id, tcp_connection)
                    })
                else:
                    tcp_connection.send((12).to_bytes(CODE_SIZE,
                                                      byteorder='big'))
                    tcp_connection.close()
            except Exception as e:
                print(e)
                tcp_connection.close()
Exemplo n.º 7
0
    def __init__(self, args):

        self.__result = None

        if self.__getData(args):
            self.__poller = createPoller('auto')
            self.__connection = TcpConnection(self.__poller, onDisconnected=self.__onDisconnected, onMessageReceived=self.__onMessageReceived, onConnected=self.__onConnected)
            if self.__password is not None:
                self.__connection.encryptor = getEncryptor(self.__password)
            self.__isConnected = self.__connection.connect(self.__host, self.__port)
            if not self.__isConnected:
                self.__result = 'can\'t connected'
            while self.__isConnected:
                self.__poller.poll(0.5)
Exemplo n.º 8
0
class Node(object):
    def __init__(self, syncObj, nodeAddr):
        self.__syncObj = weakref.ref(syncObj)
        self.__nodeAddr = nodeAddr
        self.__ip = globalDnsResolver().resolve(nodeAddr.split(':')[0])
        self.__port = int(nodeAddr.split(':')[1])
        self.__shouldConnect = syncObj._getSelfNodeAddr() > nodeAddr
        self.__encryptor = syncObj._getEncryptor()
        self.__conn = None
        if self.__shouldConnect:
            self.__conn = TcpConnection(
                poller=syncObj._poller,
                onConnected=self.__onConnected,
                onMessageReceived=self.__onMessageReceived,
                onDisconnected=self.__onDisconnected,
                timeout=syncObj._getConf().connectionTimeout,
                sendBufferSize=syncObj._getConf().sendBufferSize,
                recvBufferSize=syncObj._getConf().recvBufferSize)
            self.__conn.encryptor = self.__encryptor

        self.__lastConnectAttemptTime = 0
        self.__lastPingTime = 0
        self.__status = NODE_STATUS.DISCONNECTED
        self.__terminating = False

    def _destroy(self):
        self.__shouldConnect = False
        self.__syncObj = None
        if self.__conn is not None:
            self.__conn.disconnect()
        self.__onDisconnected()
        self.__terminating = True

    def __onConnected(self):
        self.__status = NODE_STATUS.CONNECTED
        if self.__encryptor:
            self.__conn.recvRandKey = os.urandom(32)
            self.__conn.send(self.__conn.recvRandKey)
            return
        self.__conn.send(self.__syncObj()._getSelfNodeAddr())

    def __onDisconnected(self):
        self.__status = NODE_STATUS.DISCONNECTED

    def __onMessageReceived(self, message):
        if self.__encryptor and not self.__conn.sendRandKey:
            self.__conn.sendRandKey = message
            self.__conn.send(self.__syncObj()._getSelfNodeAddr())
            return

        self.__syncObj()._onMessageReceived(self.__nodeAddr, message)

    def onPartnerConnected(self, conn):
        if self.__terminating:
            return
        self.__conn = conn
        conn.setOnMessageReceivedCallback(self.__onMessageReceived)
        conn.setOnDisconnectedCallback(self.__onDisconnected)
        self.__status = NODE_STATUS.CONNECTED

    def getStatus(self):
        return self.__status

    def isConnected(self):
        return self.__status == NODE_STATUS.CONNECTED

    def getAddress(self):
        return self.__nodeAddr

    def getSendBufferSize(self):
        return self.__conn.getSendBufferSize()

    def send(self, message):
        if self.__status != NODE_STATUS.CONNECTED:
            return False
        self.__conn.send(message)
        if self.__status != NODE_STATUS.CONNECTED:
            return False
        return True

    def connectIfRequired(self):
        if not self.__shouldConnect:
            return
        if self.__status != NODE_STATUS.DISCONNECTED:
            return
        if time.time() - self.__lastConnectAttemptTime < self.__syncObj(
        )._getConf().connectionRetryTime:
            return
        self.__status = NODE_STATUS.CONNECTING
        self.__lastConnectAttemptTime = time.time()
        if not self.__conn.connect(self.__ip, self.__port):
            self.__status = NODE_STATUS.DISCONNECTED
            return
Exemplo n.º 9
0
class Node(object):

    def __init__(self, syncObj, nodeAddr, shouldConnect = None):
        self.__syncObj = weakref.ref(syncObj)
        self.__nodeAddr = nodeAddr

        if shouldConnect is not None:
            self.__shouldConnect = shouldConnect
        else:
            self.__shouldConnect = syncObj._getSelfNodeAddr() > nodeAddr

        self.__encryptor = syncObj._getEncryptor()
        self.__conn = None

        if self.__shouldConnect:
            self.__ip = globalDnsResolver().resolve(nodeAddr.split(':')[0])
            self.__port = int(nodeAddr.split(':')[1])
            self.__conn = TcpConnection(poller=syncObj._poller,
                                        onConnected=self.__onConnected,
                                        onMessageReceived=self.__onMessageReceived,
                                        onDisconnected=self.__onDisconnected,
                                        timeout=syncObj._getConf().connectionTimeout,
                                        sendBufferSize=syncObj._getConf().sendBufferSize,
                                        recvBufferSize=syncObj._getConf().recvBufferSize)
            self.__conn.encryptor = self.__encryptor

        self.__lastConnectAttemptTime = 0
        self.__lastPingTime = 0
        self.__status = NODE_STATUS.DISCONNECTED
        self.__terminating = False

    def _destroy(self):
        self.__shouldConnect = False
        self.__syncObj = None
        if self.__conn is not None:
            self.__conn.disconnect()
        self.__onDisconnected()
        self.__terminating = True

    def __onConnected(self):
        self.__status = NODE_STATUS.CONNECTED
        if self.__encryptor:
            self.__conn.recvRandKey = os.urandom(32)
            self.__conn.send(self.__conn.recvRandKey)
            return
        selfAddr = self.__syncObj()._getSelfNodeAddr()
        if selfAddr is not None:
            self.__conn.send(selfAddr)
        else:
            self.__conn.send('readonly')

    def __onDisconnected(self):
        self.__status = NODE_STATUS.DISCONNECTED

    def __onMessageReceived(self, message):
        if self.__encryptor and not self.__conn.sendRandKey:
            self.__conn.sendRandKey = message
            self.__conn.send(self.__syncObj()._getSelfNodeAddr())
            return

        self.__syncObj()._onMessageReceived(self.__nodeAddr, message)

    def onPartnerConnected(self, conn):
        if self.__terminating:
            return
        self.__conn = conn
        conn.setOnMessageReceivedCallback(self.__onMessageReceived)
        conn.setOnDisconnectedCallback(self.__onDisconnected)
        self.__status = NODE_STATUS.CONNECTED

    def getStatus(self):
        return self.__status

    def isConnected(self):
        return self.__status == NODE_STATUS.CONNECTED

    def getAddress(self):
        return self.__nodeAddr

    def getSendBufferSize(self):
        return self.__conn.getSendBufferSize()

    def send(self, message):
        if self.__status != NODE_STATUS.CONNECTED:
            return False
        self.__conn.send(message)
        if self.__status != NODE_STATUS.CONNECTED:
            return False
        return True

    def connectIfRequired(self):
        if not self.__shouldConnect:
            return
        if self.__status != NODE_STATUS.DISCONNECTED:
            return
        if time.time() - self.__lastConnectAttemptTime < self.__syncObj()._getConf().connectionRetryTime:
            return
        self.__status = NODE_STATUS.CONNECTING
        self.__lastConnectAttemptTime = time.time()
        if not self.__conn.connect(self.__ip, self.__port):
            self.__status = NODE_STATUS.DISCONNECTED
            return
Exemplo n.º 10
0
    def run(self):
        data = {}
        data['info_hash'] = self.info_hash
        data['peer_id'] = self.my_id
        data['ip'] = self.ip
        data['port'] = self.port
        data['event'] = 'start'

        tcp_connection = TcpConnection()
        try:
            tcp_connection.connect(self.tracker_ip, self.tracker_port)
            tcp_connection.send(json.dumps(data).encode('utf-8'))
            response_message = json.loads(
                tcp_connection.receive().decode('utf-8'))
            tcp_connection.close()
        except Exception as e:
            print(e)
            tcp_connection.close()
            self.main_controller.tell({
                'header': 13,
                'body': 'Connection error with tracker'
            })
            return

        if response_message['status_code'] == '0':
            self.main_controller.tell({
                'header':
                13,
                'body':
                'Received status code 0 from tracker'
            })
            return

        self.main_controller.tell({
            'header': 9,
            'body': response_message['peers']
        })

        interval = int(float(response_message['interval']) / 1000) - 1
        data['event'] = 'update'

        while True:
            time.sleep(interval)
            try:
                tcp_connection = TcpConnection()
                tcp_connection.connect(self.tracker_ip, self.tracker_port)
                tcp_connection.send(json.dumps(data).encode('utf-8'))
                response_message = json.loads(
                    tcp_connection.receive().decode('utf-8'))
                tcp_connection.close()
            except Exception as e:
                print(e)
                tcp_connection.close()
                self.main_controller.tell({
                    'header':
                    13,
                    'body':
                    'Connection error with tracker'
                })
                return

            if response_message['status_code'] == '0':
                self.main_controller.tell({
                    'header':
                    13,
                    'body':
                    'Received status code 0 from tracker'
                })
                return

            self.main_controller.tell({
                'header': 9,
                'body': response_message['peers']
            })
Exemplo n.º 11
0
def send_message_to_tracker(request_message, tracker_ip, tracker_port):
    tcp_connection = TcpConnection()
    tcp_connection.connect(tracker_ip, tracker_port)
    tcp_connection.send(request_message.encode('utf-8'))
    response_message = tcp_connection.receive().decode('utf-8')
    print(response_message)
Exemplo n.º 12
0
	def handle_stream(self, stream, address):
		conn = TcpConnection(self.io_loop, stream, address)
		self._connections[conn.name] = conn
		conn.set_connection_callback(self._connection_cb)
		conn.set_message_callback(self._message_cb)
		conn.set_write_complete_callback(self._write_complete_cb)
		conn.set_close_callback(self._remove_connection)
		conn.connect_established()
Exemplo n.º 13
0
class Utility(object):
    def __init__(self, args):

        self.__result = None

        if self.__getData(args):
            self.__poller = createPoller('auto')
            self.__connection = TcpConnection(
                self.__poller,
                onDisconnected=self.__onDisconnected,
                onMessageReceived=self.__onMessageReceived,
                onConnected=self.__onConnected)
            if self.__password is not None:
                self.__connection.encryptor = getEncryptor(self.__password)
            self.__isConnected = self.__connection.connect(
                self.__host, self.__port)
            if not self.__isConnected:
                self.__result = 'can\'t connected'
            while self.__isConnected:
                self.__poller.poll(0.5)

    def __onMessageReceived(self, message):

        if self.__connection.encryptor and not self.__connection.sendRandKey:
            self.__connection.sendRandKey = message
            self.__connection.send(self.__data)
            return
        self.__result = message
        self.__connection.disconnect()

    def __onDisconnected(self):
        self.__isConnected = False

    def __onConnected(self):

        if self.__connection.encryptor:
            self.__connection.recvRandKey = os.urandom(32)
            self.__connection.send(self.__connection.recvRandKey)
            return
        self.__connection.send(self.__data)

    def getResult(self):
        return self.__result

    def __getData(self, args):

        parser = Parser()
        data = parser.parse(args)
        if not self.__checkCorrectAdress(data.connection):
            self.__result = 'invalid adress to connect'
            return False
        self.__host, self.__port = data.connection.split(':')
        self.__port = int(self.__port)

        self.__password = data.password
        if data.status and data.add is None and data.remove is None:
            self.__data = ['status']
            return True
        elif data.add is not None and data.remove is None and not data.status:
            if not self.__checkCorrectAdress(data.add):
                self.__result = 'invalid adress to command add'
                return False
            self.__data = ['add', data.add]
            return True
        elif data.remove is not None and data.add is None and not data.status:
            if not self.__checkCorrectAdress(data.remove):
                self.__result = 'invalid adress to command remove'
                return False
            self.__data = ['remove', data.remove]
            return True
        else:
            self.__result = 'invalid command'
            return False

    def __checkCorrectAdress(self, adress):

        try:
            host, port = adress.split(':')
            port = int(port)
            assert (port > 0 and port < 65536)
            return True
        except:
            return False
Exemplo n.º 14
0
class Utility(object):

    def __init__(self, args):

        self.__result = None

        if self.__getData(args):
            self.__poller = createPoller('auto')
            self.__connection = TcpConnection(self.__poller, onDisconnected=self.__onDisconnected, onMessageReceived=self.__onMessageReceived, onConnected=self.__onConnected)
            if self.__password is not None:
                self.__connection.encryptor = getEncryptor(self.__password)
            self.__isConnected = self.__connection.connect(self.__host, self.__port)
            if not self.__isConnected:
                self.__result = 'can\'t connected'
            while self.__isConnected:
                self.__poller.poll(0.5)


    def __onMessageReceived(self, message):

        if self.__connection.encryptor and not self.__connection.sendRandKey:
            self.__connection.sendRandKey = message
            self.__connection.send(self.__data)
            return
        self.__result = message
        self.__connection.disconnect()

    def __onDisconnected(self):
        self.__isConnected = False

    def __onConnected(self):

        if self.__connection.encryptor:
            self.__connection.recvRandKey = os.urandom(32)
            self.__connection.send(self.__connection.recvRandKey)
            return
        self.__connection.send(self.__data)

    def getResult(self):
        return self.__result

    def __getData(self, args):

        parser = Parser()
        data = parser.parse(args)
        if not self.__checkCorrectAdress(data.connection):
            self.__result = 'invalid adress to connect'
            return False
        self.__host, self.__port = data.connection.split(':')
        self.__port = int(self.__port)

        self.__password = data.password
        if data.status and data.add is None and data.remove is None:
            self.__data = ['status']
            return True
        elif data.add is not None and data.remove is None and not data.status:
            if not self.__checkCorrectAdress(data.add):
                self.__result = 'invalid adress to command add'
                return False
            self.__data = ['add', data.add]
            return True
        elif data.remove is not None and data.add is None and not data.status:
            if not self.__checkCorrectAdress(data.remove):
                self.__result = 'invalid adress to command remove'
                return False
            self.__data = ['remove', data.remove]
            return True
        else:
            self.__result = 'invalid command'
            return False


    def __checkCorrectAdress(self, adress):

        try:
            host, port = adress.split(':')
            port = int(port)
            assert (port > 0 and port < 65536)
            return True
        except:
            return False