예제 #1
0
    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
예제 #2
0
 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
예제 #3
0
 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()