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