def send_ack(self, seq_num, client_addr): # Prepare Acknowledgement packet = struct.pack('IH', seq_num, self.header) # Calculate checksum checksum = Checksum.calculate(packet) # Add Checksum to the packet packet = ctypes.create_string_buffer(8) struct.pack_into('IHH', packet, 0, seq_num, checksum, self.header) # Corrupt packet based on the probability if random.random() <= self.packet_corrupt_probability: packet[random.randint(0, len(packet) - 1)] = 0 # Send ACK time.sleep(1) self.server_socket.sendto(packet, client_addr) self.logger.info('Sequence Number %d - Acknowledgement Sent', seq_num)
def get_next_packet(self, seq_num): if self.num_packets == 0: return None self.num_packets -= 1 # Create packet data = ''.join( random.choice(string.ascii_uppercase + string.digits) for _ in range(self.mss - 8)).encode('ascii') length = len(data) # Create packet packet = struct.pack('IH' + str(length) + 's', seq_num, self.header, data) # Calculate checksum checksum = Checksum.calculate(packet) # Add Checksum to the packet packet = ctypes.create_string_buffer(self.mss) struct.pack_into('IHH' + str(length) + 's', packet, 0, seq_num, checksum, self.header, data) return packet