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 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.º 3
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.º 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 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.º 8
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)