def handle_connection_message(client): msg = client.recv(comum.CONNECTION_MESSAGE_SIZE) decoded_message = MessageFactory.decode(msg) if decoded_message.type != "CONNECTION": logging.warning("Server did not send a valid CONNECTION message",extra=LogHelper.set_extra('CONTROL',client.getpeername())) return None logging.debug(f"Received a CONNECTION message with port {decoded_message.udp_port}",extra=LogHelper.set_extra('CONTROL',client.getpeername())) return decoded_message.udp_port
def handle_hello(client): msg = client.control_channel.recv(comum.SIMPLE_MESSAGE_SIZE) decoded_message = MessageFactory.decode(msg) logging.debug(f"Received a {decoded_message.type}", extra=LogHelper.set_extra('CONTROL',client.addr)) if decoded_message.type != "HELLO": logging.warning("Client did not send HELLO",extra=LogHelper.set_extra("CONTROL", client.addr)) return False return True
def handle_info_file(client): msg = client.control_channel.recv(comum.INFO_FILE_MESSAGE_SIZE) decoded_message = MessageFactory.decode(msg) logging.debug(f"Received a {decoded_message.type}", extra=LogHelper.set_extra('CONTROL',client.addr)) if decoded_message.type != "INFO FILE": logging.warning("Client did not send a valid INFO FILE", extra=LogHelper.set_extra('CONTROL',client.addr)) return False client.create_streamed_file(decoded_message.file_name, decoded_message.file_size) logging.debug("Finished allocating structures for file", extra=LogHelper.set_extra('CONTROL',client.addr)) return True
def handle_ok(client): msg = client.recv(comum.SIMPLE_MESSAGE_SIZE) decoded_message = MessageFactory.decode(msg) if decoded_message.type != "OK": logging.warning(f"Server did not send OK",extra=LogHelper.set_extra('CONTROL',client.getpeername())) return False logging.debug(f"Received an OK to proceed sending the file",extra=LogHelper.set_extra('CONTROL',client.getpeername())) return True
def handle_file(client): logging.info("Started listening for file parts...",extra=LogHelper.set_extra('DATA',client.addr)) while not client.streamed_file.finished_streaming(): msg = client.data_channel.recvmsg(comum.FILE_MESSAGE_SIZE) decoded_message = MessageFactory.decode(msg[0]) if decoded_message.type == "FILE": threading.Thread(target = handle_file_part, args = (client, decoded_message)).start() else: logging.warning("Client did not send a valid FILE message",extra=LogHelper.set_extra('DATA',client.addr)) return False return True
def handle_fim(client): while True: msg = client.recv(comum.SIMPLE_MESSAGE_SIZE) decoded_message = MessageFactory.decode(msg) if decoded_message.type == "FIM": print(f"\n[{client.getpeername()[0]}:{client.getpeername()[1]} - CONTROL CHANNEL] Server finished processing file") return True elif decoded_message.type == "ACK": continue else: logging.warning("Server did not send neither a FIM or ACK message",extra=LogHelper.set_extra('CONTROL',client.getpeername())) return False
def handle_ack(client: socket.socket, file_control: FileControl): acked_msgs = 0 progress_bar = None if logging.getLevelName(logging.root.level) != 'DEBUG': progress_bar = ProgressBar(len(file_control.payloads)) print('Upload progress:') progress_bar.init_print() while acked_msgs < len(file_control.payloads): msg = client.recv(comum.ACK_MESSAGE_SIZE) decoded_message = MessageFactory.decode(msg) if decoded_message.type != "ACK": logging.warning("Did not receive enough ACKs",extra=LogHelper.set_extra('CONTROL',client.getpeername())) return False if decoded_message.type == 'ACK': logging.debug(f"Received ACK for payload #{decoded_message.serial_number}",extra=LogHelper.set_extra('CONTROL',client.getpeername())) threading.Thread(target = file_control.sliding_window.acked, args=(decoded_message.serial_number,)).start() if progress_bar: progress_bar.increase() acked_msgs +=1 if progress_bar: progress_bar.end_print() return True