Untitled
unknown
plain_text
10 months ago
3.0 kB
8
Indexable
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/select.h>
#include<pthread.h>
#define timeoutValue 5
#define packetCount 10
#define windowSize 3
typedef struct Packet {
int id;
int sent;
} Packet;
Packet packets[packetCount];
pthread_t thread[packetCount], receivedThread;
int sockfd;
struct sockaddr_in addr;
int windowStart, windowEnd;
int nextToSend;
void* sendPacket(void* sendToPacket) {
Packet* packet = (Packet*)sendToPacket;
char buffer[1024];
while (packet->sent == 0) {
printf("Client: Sending packet %d\n", packet->id);
bzero(buffer, 1024);
sprintf(buffer, "%d", packet->id);
sendto(sockfd, buffer, 1024, 0, (struct sockaddr*)&addr, sizeof(addr));
sleep(timeoutValue);
if (packet->sent == 0) {
printf("Client: Timeout for packet %d\n", packet->id);
}
}
return NULL;
}
void* receivePacket(void* arg) {
char buffer[1024];
socklen_t addr_size = sizeof(addr);
while (1) {
bzero(buffer, 1024);
recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr*)&addr, &addr_size);
char msg[20];
int packetID;
sscanf(buffer, "%s%d", msg, &packetID);
if (strcmp(msg, "NACK") == 0) {
printf("Client: Received negative acknowledgment for packet %d. Sending again.\n", packetID);
pthread_cancel(thread[packetID - 1]);
pthread_create(&thread[packetID - 1], NULL, sendPacket, (void*)&packets[packetID - 1]);
}
else if (strcmp(msg, "ACK") == 0) {
printf("Client: Received ACK for packet %d\n", packetID);
packets[packetID - 1].sent = 1;
if (windowStart == packetID - 1) {
while (packets[windowStart].sent == 1 && windowStart < windowEnd) {
windowStart++;
if (windowEnd < packetCount - 1) {
windowEnd++;
}
}
}
}
else {
printf("Client: Invalid message\n");
}
}
return NULL;
}
void main() {
for (int i = 0; i < packetCount; i++) {
packets[i].id = i + 1;
packets[i].sent = 0;
}
char* ip = "127.0.0.100";
int port = 5570;
socklen_t addr_size;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("[-] Socket error");
exit(1);
}
memset(&addr, '\0', sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = inet_addr(ip);
pthread_create(&receivedThread, NULL, receivePacket, NULL);
windowStart = 0;
windowEnd = windowStart + windowSize - 1;
while (windowStart <= windowEnd && windowStart < packetCount) {
pthread_create(&thread[windowStart], NULL, sendPacket, (void*)&packets[windowStart]);
nextToSend++;
}
close(sockfd);
}Editor is loading...
Leave a Comment