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()
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']])
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'] ]
def send_getaddr(self): self.sock.sendall(serialize_msg(b'getaddr'))
def send_pong(self, payload): res = serialize_msg(command=b'pong', payload=payload) self.sock.sendall(res)
def send_verack(self): msg = serialize_msg(command=b"verack") self.sock.sendall(msg)
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')