Assignment No.
Name- Shashwat Diwan
Roll no.- 60
Div- SY-IT A
Problem Statement : Implement Go-Back-N and Selective Repeat Protocol using TCP/UDP
socket
\ GBN Sender (gbn_sender.c)
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <time.h>
#pragma comment(lib, "ws2_32.lib")
#define SERVER_IP "127.0.0.1"
#define PORT 8080
#define WINDOW_SIZE 4
#define TOTAL_FRAMES 10
#define LOSS_PROBABILITY 20 // Percentage chance of ACK loss
void send_frames(SOCKET sock, struct sockaddr_in serverAddr) {
int base = 0, nextSeqNum = 0;
int ack, serverLen = sizeof(serverAddr);
while (base < TOTAL_FRAMES) {
while (nextSeqNum < base + WINDOW_SIZE && nextSeqNum <
TOTAL_FRAMES) {
printf("Sending Frame %d\n", nextSeqNum);
sendto(sock, (char *)&nextSeqNum, sizeof(int), 0, (struct
sockaddr*)&serverAddr, serverLen);
nextSeqNum++;
}
if (recvfrom(sock, (char *)&ack, sizeof(int), 0, (struct
sockaddr*)&serverAddr, &serverLen) != SOCKET_ERROR) {
printf("Received ACK for Frame %d\n", ack);
base = ack + 1;
} else {
printf("Timeout! Resending from Frame %d\n", base);
nextSeqNum = base;
}
}
}
int main() {
WSADATA wsa;
SOCKET senderSocket;
struct sockaddr_in serverAddr;
WSAStartup(MAKEWORD(2, 2), &wsa);
senderSocket = socket(AF_INET, SOCK_DGRAM, 0);
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP);
serverAddr.sin_port = htons(PORT);
send_frames(senderSocket, serverAddr);
closesocket(senderSocket);
WSACleanup();
return 0;
}
\GBN Receiver (gbn_receiver.c)
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <time.h>
#pragma comment(lib, "ws2_32.lib")
#define PORT 8080
#define LOSS_PROBABILITY 20 // Simulate 20% ACK loss
void receive_frames(SOCKET sock, struct sockaddr_in clientAddr) {
int expectedFrame = 0, frame, clientLen = sizeof(clientAddr);
while (expectedFrame < 10) {
recvfrom(sock, (char *)&frame, sizeof(int), 0, (struct
sockaddr*)&clientAddr, &clientLen);
if (frame == expectedFrame) {
printf("Received Frame %d. Sending ACK %d\n", frame, frame);
if (rand() % 100 >= LOSS_PROBABILITY) { // Simulate ACK loss
sendto(sock, (char *)&frame, sizeof(int), 0, (struct
sockaddr*)&clientAddr, clientLen);
}
expectedFrame++;
} else {
printf("Discarding Out-of-Order Frame %d\n", frame);
}
}
}
int main() {
WSADATA wsa;
SOCKET receiverSocket;
struct sockaddr_in serverAddr, clientAddr;
WSAStartup(MAKEWORD(2, 2), &wsa);
receiverSocket = socket(AF_INET, SOCK_DGRAM, 0);
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_port = htons(PORT);
bind(receiverSocket, (struct sockaddr*)&serverAddr,
sizeof(serverAddr));
printf("Waiting for frames...\n");
receive_frames(receiverSocket, clientAddr);
closesocket(receiverSocket);
WSACleanup();
return 0;
}
\SR Sender (sr_sender.c)
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <time.h>
#pragma comment(lib, "ws2_32.lib")
#define SERVER_IP "127.0.0.1"
#define PORT 8080
#define WINDOW_SIZE 4
#define TOTAL_FRAMES 10
void send_frames(SOCKET sock, struct sockaddr_in serverAddr) {
int sentFrames[TOTAL_FRAMES] = {0}, frame, ack;
int serverLen = sizeof(serverAddr);
for (frame = 0; frame < TOTAL_FRAMES; frame++) {
printf("Sending Frame %d\n", frame);
sendto(sock, (char *)&frame, sizeof(int), 0, (struct
sockaddr*)&serverAddr, serverLen);
sentFrames[frame] = 1;
}
while (1) {
recvfrom(sock, (char *)&ack, sizeof(int), 0, (struct
sockaddr*)&serverAddr, &serverLen);
printf("Received ACK for Frame %d\n", ack);
sentFrames[ack] = 0;
int allAcked = 1;
for (int i = 0; i < TOTAL_FRAMES; i++) {
if (sentFrames[i] == 1) {
allAcked = 0;
printf("Resending Frame %d\n", i);
sendto(sock, (char *)&i, sizeof(int), 0, (struct
sockaddr*)&serverAddr, serverLen);
}
}
if (allAcked) break;
}
}
int main() {
WSADATA wsa;
SOCKET senderSocket;
struct sockaddr_in serverAddr;
WSAStartup(MAKEWORD(2, 2), &wsa);
senderSocket = socket(AF_INET, SOCK_DGRAM, 0);
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP);
serverAddr.sin_port = htons(PORT);
send_frames(senderSocket, serverAddr);
closesocket(senderSocket);
WSACleanup();
return 0;
}
\SR Receiver (sr_receiver.c)
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#define PORT 8080
#define WINDOW_SIZE 4
#define TOTAL_FRAMES 10
void receive_frames(SOCKET sock, struct sockaddr_in clientAddr) {
int receivedFrames[TOTAL_FRAMES] = {0}, frame;
int clientLen = sizeof(clientAddr);
while (1) {
recvfrom(sock, (char *)&frame, sizeof(int), 0, (struct
sockaddr*)&clientAddr, &clientLen);
printf("Received Frame %d\n", frame);
receivedFrames[frame] = 1;
sendto(sock, (char *)&frame, sizeof(int), 0, (struct
sockaddr*)&clientAddr, clientLen);
printf("Sent ACK for Frame %d\n", frame);
int allReceived = 1;
for (int i = 0; i < TOTAL_FRAMES; i++) {
if (receivedFrames[i] == 0) {
allReceived = 0;
break;
}
}
if (allReceived) break;
}
}
int main() {
WSADATA wsa;
SOCKET receiverSocket;
struct sockaddr_in serverAddr, clientAddr;
WSAStartup(MAKEWORD(2, 2), &wsa);
receiverSocket = socket(AF_INET, SOCK_DGRAM, 0);
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_port = htons(PORT);
bind(receiverSocket, (struct sockaddr*)&serverAddr,
sizeof(serverAddr));
printf("Waiting for frames...\n");
receive_frames(receiverSocket, clientAddr);
closesocket(receiverSocket);
WSACleanup();
return 0;
}
GBN Output:-
SR Output:-