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