def recv_and_send_ack(self): print('Connected to socket #' + str(self.socket.getsockname()[1])) corrupted = self.get_corrupted_packets(self.file_len, 0, 5) exp_pkt_num = 0 while True: try: # self.socket.settimeout(5) pkt, adr = self.socket.recvfrom(600) recv_pkt = Packet(pkd_data=pkt) if recv_pkt.seqno in corrupted: recv_pkt.checksum = recv_pkt.checksum - 10 corrupted.remove(recv_pkt.seqno) if adr[0] == self.server_ip: print('Received packet# ' + str(recv_pkt.seqno)) cs = calc_checksum(recv_pkt.data, type='bytes') ack = Packet(type='ack', seqno=recv_pkt.seqno, chk_sum=cs) pkd_ack = ack.pack(type='ack') if recv_pkt.seqno == exp_pkt_num and recv_pkt.checksum == calc_checksum( recv_pkt.data, type='bytes'): print('Sending Ack# ' + str(recv_pkt.seqno)) self.recv_pkt_list.append(recv_pkt) self.socket.send(pkd_ack) exp_pkt_num += 1 else: if recv_pkt.checksum != calc_checksum(recv_pkt.data, type='bytes'): print('Packet # ', recv_pkt.seqno, 'is corrupted, re-receiving') continue if self.file_len == len(self.recv_pkt_list): print('File received successfully.') break except socket.timeout: print('Packet# ', exp_pkt_num, ' timed out, re-receiving.') continue