SLIDING WINDOW
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;



Comments