#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <stdbool.h> #define MAX_SEQ 4 // Maximum sequence number (0 to 7) #define WINDOW_SIZE 4 // Size of the sliding window // Packet structure typedef struct { int seq_num; // Sequence number bool ack; // Acknowledgment flag } Packet; // Function prototypes void sender(); void receiver(); void send_packet(Packet packet); bool receive_packet(Packet packet); bool simulate_packet_loss(); int main() { // Start sender and receiver (in a real implementation, these would run in separate threads or processes) sender(); receiver(); return 0; } void sender() { int next_seq_num = 0; // Next sequence number to send int acked = 0; // Last acknowledged packet int window_start = 0; // Start of the sliding window while (window_start <= MAX_SEQ) { // Send packets within the window while (next_seq_num < window_start + WINDOW_SIZE && next_seq_num <= MAX_SEQ) { Packet packet = {next_seq_num, false}; send_packet(packet); next_seq_num++; sleep(1); // Simulate time taken to send a packet } // Simulate receiving an acknowledgment (in real systems this would be from the receiver) for (int i = acked; i < next_seq_num; i++) { if (receive_packet((Packet){i, true})) { acked++; } } // Slide the window window_start = acked; next_seq_num = window_start; // Move next_seq_num to the next unacknowledged packet } printf("Sender finished transmitting all packets.\n"); } void receiver() { for (int i = 0; i <= MAX_SEQ; i++) { sleep(1); // Simulate processing time for receiving a packet if (simulate_packet_loss()) { printf("Receiver: Lost packet with seq_num %d\n", i); continue; // Simulate loss } printf("Receiver: Received packet with seq_num %d\n", i); } } void send_packet(Packet packet) { printf("Sender: Sending packet with seq_num %d\n", packet.seq_num); } bool receive_packet(Packet packet) { // Simulate acknowledgment logic if (packet.ack) { printf("Receiver: Acknowledgment for packet with seq_num %d\n", packet.seq_num); return true; } return false; } bool simulate_packet_loss() { // Randomly simulate packet loss (30% chance) return (rand() % 10) < 3;