def receive(self): r_data = None while True: try: r_data, address = self.sock.recvfrom(self.widgets.pack_size.get()) except BlockingIOError: # buffer-ul socket-ului este gol pass except ConnectionResetError: """ Daca ack-ul pentru pachetul FIN nu a fost receptionat in cel mult 2 secunde de la trimiterea acestuia, atunci inchidem conexiunea automat. """ if (self.timer != 0 and int(round(time.time() * 1000)) - self.timer > 2000): self.handle_end_of_connection() break time.sleep(0.5) # daca s-a primit un pachet de ack atunci acesta este eliminat din dictionar si este actualizata fereastra if r_data: r_pack = Package() r_pack.set_data(r_data) self.handler.remove_package(r_pack) self.update_cwnd() self.dec_pack_in_transit() # s-a receptionat ultimul pachet, adica cel care are flag-ul de FIN activ, asadar conexiunea este incheiata if r_pack.get_flag(1): self.handle_end_of_connection() break r_data = None
def wait_for_syn_pack(self): data = None while not data: data, address = self.sock.recvfrom(self.widgets.pack_size.get()) time.sleep(0.01) server_syn_pack = Package() server_syn_pack.set_data(data) if server_syn_pack.get_flag(0): self.message_box.insert_message("SYN package has been received. Successful connection.") self.rf = open(file_path, "rb") self.handler.remove_package(server_syn_pack) thread2 = threading.Thread(target=self.receive) thread2.start()
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