def create_pack(self, data): pack = Package() pack.add_data(data) pack.set_dim(len(data)) pack.set_num(self.pack_cnt) self.inc_cnt() return pack
def send(self): self.handler.run() # are loc starea de initializare(este transmis pachetul SYN si se asteapta ack-ul pentru acesta). self.send_syn_pack() self.wait_for_syn_pack() while True: # un nou pachet este creat doar daca nr. de pachete aflate in tranzit este mai mic decat dim. ferestrei if self.pack_in_transit < self.cwnd: data = self.rf.read(self.widgets.pack_size.get()-16) # nu s-a ajuns la finalul fisierului, asadar un nou pachet este creat si transmis clasei handler if len(data) != 0: pack = self.create_pack(data) self.handler.add_package(pack) self.inc_pack_in_transit() # s-a ajuns la finalul fisierului prin urmare trebuie transmis pachetul FIN pentru incheierea conexiunii. else: pack = Package() pack.set_flag(1) pack.set_num(self.pack_cnt) self.message_box.insert_message("FIN pack has been sent.") self.handler.add_package(pack) # salvam momentul trimiterii pachetului FIN self.timer = int(round(time.time() * 1000)) self.rf.close() break time.sleep(0.001)
def get_ack_for_syn_pack(self, dim): ack_pack = Package() ack_pack.set_flag(0) ack_pack.set_num(self.pack_cnt) self.inc_cnt() ack_pack.set_ack(dim) return ack_pack
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 send_syn_pack(self): self.widgets.connection_is_active = True syn_pack = Package() syn_pack.set_flag(0) file_size = os.path.getsize(file_path) total_pack_num = int(math.ceil(file_size/(self.widgets.pack_size.get()-16))) file_path_encoded = (file_path+"/" +str(total_pack_num)+"/" +str(self.widgets.pack_size.get())+"/" +str(self.widgets.lost_percentage.get())).encode() syn_pack.set_num(self.pack_cnt) self.inc_cnt() syn_pack.add_data(file_path_encoded) syn_pack.set_dim(len(file_path_encoded)) self.handler.add_package(syn_pack) self.message_box.insert_message("SYN package has been sent.")
def get_ack_pack(self, pack): ack_pack = Package() ack_pack.set_num(pack.get_num()) ack_pack.set_ack(pack.get_dim()) return ack_pack