SLIDING WINDOW

PHOTO EMBED

Fri Nov 15 2024 17:52:53 GMT+0000 (Coordinated Universal Time)

Saved by @coding1

#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;
content_copyCOPY