Ejemplo n.º 1
0
def crawler(addresses):
    while True:
        # Get next address from addresses and connect
        address = addresses.pop()

        try:
            # Establish connection
            print(f'Connecting to {address}')
            sock = handshake(address)  # FIXME: save the version payload
            stream = sock.makefile('rb')

            # Request peer's peers
            sock.sendall(serialize_msg(b'getaddr'))

            # Print every gossip message we receive
            while True:
                msg = read_msg(stream)
                command = msg['command']
                payload_len = len(msg['payload'])
                print(f'Received a "{command}" containing {payload_len} bytes')

                # Respond to "ping"
                if command == b'ping':
                    res = serialize_msg(command=b'pong',
                                        payload=msg['payload'])
                    sock.sendall(res)
                    print("Send 'pong'")

                # Specially handle peer lists
                if command == b'addr':
                    payload = read_addr_payload(BytesIO(msg['payload']))
                    if len(payload['addresses']) > 1:
                        addresses.extend([(a['ip'], a['port'])
                                          for a in payload['addresses']])
                        break
        except Exception as e:
            print(f'Got error: {str(e)}')
            continue
    def open(self):
        # set start time
        self.start = time.time()

        # open TCP connection
        print("Connecting to {}".format(self.node.ip))
        self.sock = handshake(self.node.address)
        self.stream = self.sock.makefile('rb')

        # Request peer's peers
        self.sock.sendall(serialize_msg(b'getaddr'))

        # Handle messages until program exits
        while self.remain_alive():
            self.handle_msg()
Ejemplo n.º 3
0
    def open(self):
        # Set start time
        self.start = time.time()

        # Open TCP connection
        print(f'Connecting to {self.node.ip}')
        self.sock = handshake(
            self.node.address)  # FIXME: save the version payload
        self.stream = self.sock.makefile('rb')

        # Request peer's peers
        self.sock.sendall(serialize_msg(b'getaddr'))

        # Handle messages until program exists
        while self.remain_alive():
            self.handle_msg()
    def handle_msg(self):
        msg = read_msg(self.stream)
        command = msg['command']
        payload_len = len(msg['payload'])
        print('Received a {} containing {} bytes'.format(command, payload_len))

        # respond to ping
        if command == b'ping':
            res = serialize_msg(command=b'pong', payload=msg['payload'])
            self.sock.sendall(res)
            print('Sent pong')

        # handle peer lists
        if command == b'addr':
            payload = read_addr_payload(BytesIO(msg['payload']))
            if len(payload['addresses']) > 1:
                self.nodes_discovered.extend(
                    [Node(a['ip'], a['port']) for a in payload['addresses']])
Ejemplo n.º 5
0
    def handle_msg(self):
        msg = read_msg(self.stream)
        command = msg['command']
        payload_len = len(msg['payload'])
        print(f'Received a "{command}" containing {payload_len} bytes')

        # Respond to "ping"
        if command == b'ping':
            res = serialize_msg(command=b'pong', payload=msg['payload'])
            self.sock.sendall(res)
            print("Send 'pong'")

        # Specially handle peer lists
        if command == b'addr':
            payload = read_addr_payload(BytesIO(msg['payload']))
            if len(payload['addresses']) > 1:
                self.nodes_discovered = [
                    Node(a['ip'], a['port']) for a in payload['addresses']
                ]
Ejemplo n.º 6
0
 def send_getaddr(self):
     self.sock.sendall(serialize_msg(b'getaddr'))
Ejemplo n.º 7
0
 def send_pong(self, payload):
     res = serialize_msg(command=b'pong', payload=payload)
     self.sock.sendall(res)
Ejemplo n.º 8
0
 def send_verack(self):
     msg = serialize_msg(command=b"verack")
     self.sock.sendall(msg)
Ejemplo n.º 9
0
 def send_version(self):
     payload = serialize_version_payload()
     msg = serialize_msg(command=b"version", payload=payload)
     self.sock.sendall(msg)
 def send_pong(self, payload):
     res = serialize_msg(command=b'pong', payload=payload)
     self.sock.sendall(res)
     logger.info('Sent pong')