def execute(self): # Read packets and process while True: message, client_addr = self.server_socket.recvfrom(5000) packet = struct.unpack('IHH' + str(len(message) - 8) + 's', message) # Drop packet if random.random() <= self.packet_drop_probability: self.logger.info('Sequence Number %d - Packet Dropped', packet[0]) continue self.logger.info('Sequence Number %d - Packet Received', packet[0]) # Verify packet checksum if not Checksum.verify(message): self.logger.info('Sequence Number %d - Packet is Corrupt', packet[0]) continue self.process(packet, client_addr)
def get_next_ack(self): message = self.socket.recv(self.mss) packet = struct.unpack('IHH', message) # Drop ack based on probability if random.random() <= self.packet_drop_probability: self.logger.info( 'Acknowledgement Number %d - Acknowledgement Dropped', packet[0]) return False self.logger.info( 'Acknowledgement Number %d - Acknowledgement Received', packet[0]) # Packet corrupted, ignore if not Checksum.verify(message): self.logger.info( 'Acknowledgement Number %d - Acknowledgement Corrupted', packet[0]) return False return packet
def startListening(self): while True: try: data, addr = self.serverSock.recvfrom(1024) packet = Packet() packet.deserializePacket(data) # print('addr: ', addr) if (self.simulatePacketLoss()): print("Simulating packet loss for packet with seq no: ", packet.seq_num) continue if (Checksum.verify(packet.data, packet.checksum)): ack_num, discard = self.protocol.receive_packet(packet) if (discard): print("Discarding packet with sequence number " + str(packet.seq_num)) else: print("Received Segment: ", str(packet.seq_num)) _ = self.serverSock.sendto(str(ack_num).encode(), addr) #sending ack with ack_num print("ACK Sent: ", str(ack_num)) else: print( "Discarding packet with invalid checksum, packet no: ", packet.seq_num) except KeyboardInterrupt: print('Interrupted') os._exit(0) except ConnectionResetError: pass # Do nothing. except Exception: raise Exception return