示例#1
0
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
示例#2
0
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
示例#3
0
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
示例#4
0
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
示例#5
0
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
示例#6
0
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
示例#7
0
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