def handle_fin_pack(self, address):
     self.wf.close()
     self.message_box.insert_message("FIN pack has been received.")
     ack_pack = Package()
     ack_pack.set_flag(1)
     ack_pack.set_num(self.pack_cnt)
     self.sock.sendto(ack_pack.get_data(), address)
     self.message_box.insert_message("FIN pack has been sent.")
     self.message_box.insert_message("File " + self.file_name +
                                     " has been received successfully.")
     self.sock.close()
 def listen(self):
     data = None
     address = None
     while True:
         try:
             data, address = self.sock.recvfrom(self.pack_size)
         except BlockingIOError:
             # buffer-ul este gol
             pass
         # a fost receptionat un pachet
         if data:
             # este creat pachetul pe baza datelor receptionate
             pack = Package()
             pack.set_data(data)
             # verificam ca pachetul are dimensiunea specificata, altfel ii facem 'drop'
             if pack.get_dim() == len(pack.get_data()[8:]):
                 # se verifica daca a fost receptionat pachetul SYN
                 if self.pack_cnt == 0 and pack.get_flag(0):
                     self.handle_syn_pack(pack, address)
                 # se verifica daca a fost receptionat pachetul FIN
                 elif pack.get_flag(1):
                     # se verifica daca pachetul FIN este cel asteptat
                     if pack.get_num() == self.pack_cnt:
                         # daca pachetul FIN este cel asteptat atunci trimitem ack-ul si incheiem conexiunea.
                         self.handle_fin_pack(address)
                         break
                 # s-a receptionat un pachet normal(cu flag-urile SYN si FIN inactive).
                 else:
                     rand_val = random.random()
                     # facem 'drop' pachetelor conform procentului indicat
                     if rand_val > self.lost_percentage:
                         # am primit pachetul cu numarul asteptat, adica care urmeaza a fi scris in fisier
                         if pack.get_num() == self.pack_cnt:
                             self.handle_normal_pack(pack, address)
                         # a fost receptionat un pachet care a fost deja scris in fisier
                         elif pack.get_num() < self.pack_cnt:
                             self.handle_old_package(pack, address)
                         # a fost receptionat un pachet ulterior celui asteptat
                         else:
                             self.handle_following_package(pack, address)
                     else:
                         self.message_box.insert_message(
                             "Package no. " + str(pack.get_num()) +
                             " has been dropped.")
             data = None