Ejemplo n.º 1
0
def main():
    server_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    server_sock.bind((UDP_IP_ADDRESS, UDP_PORT_NO))
    print('Receiver started on ', UDP_IP_ADDRESS, ':', UDP_PORT_NO, sep="")
    print('Your file(s) will be saved in', (receiver_folder + '/'), end="\n\n")

    while (True):
        data, addr = server_sock.recvfrom(Packet.MAX_PACKET_SIZE)

        sender_port = addr[1]

        recv_pkt = None
        try:
            recv_pkt = Packet.bytesToPacket(data)
        except:
            continue

        if (recv_pkt.CHECKSUM != recv_pkt.compute_checksum()):  # invalid data
            continue

        # Message type
        msg_type = recv_pkt.TYPE

        # Message id
        msg_id = recv_pkt.ID

        # Message sequence
        msg_seq = recv_pkt.SEQ

        # Send ACK-like packet
        ack_packet = None
        if (msg_type == Packet.DATA):
            ack_packet = Packet(Packet.ACK, msg_id, msg_seq)
        elif (msg_type == Packet.FIN):
            ack_packet = Packet(Packet.FIN_ACK, msg_id, msg_seq)
        server_sock.sendto(ack_packet.get_Packet(), addr)

        msg_data = recv_pkt.DATA
        client = {}
        if (not Client.is_connected_client(sender_port)):  # new client
            client = Client(sender_port)
        else:
            client = Client.get_client(sender_port)

        file_idx = client.search_file(msg_id)
        if (file_idx == -1):
            print("Receiving new file with\nPacket ID:",
                  msg_id,
                  "\nPort:",
                  client.port,
                  end="\n\n")
            file_idx = client.add_new_file(msg_id)
        file_obj = client.files[file_idx]

        if (msg_type == Packet.DATA):
            if ((file_obj.sequence + 1) == msg_seq and file_obj.is_active()):
                file_obj.sequence += 1
                file_obj.write(msg_data)

        elif (msg_type == Packet.FIN):
            if ((file_obj.sequence + 1) == msg_seq and file_obj.is_active()):
                file_obj.update_sequence()
                file_obj.write(msg_data)
                file_obj.finalize()
                print("File with\nPacket ID:",
                      msg_id,
                      "\nPort:",
                      client.port,
                      "\nSuccessfully received!",
                      end="\n\n")