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")