0% found this document useful (0 votes)
18 views10 pages

CN Lab6 60

The document contains code implementations for Go-Back-N (GBN) and Selective Repeat (SR) protocols using TCP/UDP sockets in C. It includes sender and receiver functions for both protocols, demonstrating frame sending, acknowledgment handling, and loss simulation. The code is structured for a local server setup, with defined constants for server IP, port, and frame handling parameters.

Uploaded by

shashwat.diwan23
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
18 views10 pages

CN Lab6 60

The document contains code implementations for Go-Back-N (GBN) and Selective Repeat (SR) protocols using TCP/UDP sockets in C. It includes sender and receiver functions for both protocols, demonstrating frame sending, acknowledgment handling, and loss simulation. The code is structured for a local server setup, with defined constants for server IP, port, and frame handling parameters.

Uploaded by

shashwat.diwan23
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 10

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:-

You might also like