Esempio n. 1
0
 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