Untitled

 avatar
unknown
plain_text
2 months ago
2.5 kB
2
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 packetCounter 5
#define windowSize 3
void sendWindowPacket(int*sockfd,struct sockaddr_in addr,int packet[],int windowStart,int windowEnd)
{
	char buffer[1024];
	while(windowStart<windowEnd)
	{
		bzero(buffer,1024);
		sprintf(buffer,"%d",packet[windowStart]);
		printf("Client: Sending packet %s \n",buffer);
		sendto(*sockfd,buffer,1024,0,(struct sockaddr *)&addr,sizeof(addr));
		windowStart++;
	}
}
void main()
{
	char*ip="127.0.0.1";
	int port=5555;
	pthread_t timeoutThread;
	int sockfd;
	struct sockaddr_in addr;
	char buffer[1024];
	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);
	int packet[packetCounter];
	for(int i=0;i<packetCounter;++i)
		packet[i]=i+1;
	int windowStart=0;
	int windowEnd=windowStart+windowsize;
	int flag=1;
	sendWindowPacket(&sockfd,addr,packet,windowStart,windowEnd);
	while(windowStart!=windowEnd)
	{
		bzero(buffer,1024);
		addr_size=sizeof(addr);
		struct timeval  timeout;
		timeout.tv_sec=timeoutValue;
		timeout.tv_usec=0;
		if(setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,&timeout,sizeof(timeout))<0)
			printf("error\n");
		else
		{
			bzero(buffer,1024);
			addr_size=sizeof(addr);
			int rec=recvfrom(sockfd,buffer,1024,0,(struct sockaddr*)&addr,&addr_size);
			if(rec<0)
			{
				printf("client :Timeout error!sending packet again\n");
				sendWindowPacket(&sockfd,addr,packet,windowStart,windowEnd);
			}
			
			else
			{
				printf("client received acknowledgement for packet%s \n",buffer);
				if(atoi(buffer)!=packet[windowStart])
				{
					printf("client :wrong ack!sending packet again\n");
					sendWindowPacket(&sockfd,addr,packet,windowStart,windowEnd);
				}				
				else
				{
					windowStart++;
					if(windowEnd<packetCounter)
						windowEnd++;
					if(windowStart!=windowEnd)
					{
						bzero(buffer,1024);
						if(flag==1)
						{
							sprintf(buffer,"%d",packet[windowEnd]);
							printf("Client: Sending packet %s \n",buffer);
							sendto(sockfd,buffer,1024,0,(struct sockaddr *)&addr,sizeof(addr));
						}
						if(windowEnd==packetCounter)
							flag=0;
					}
				}
			}
		}
		sleep(1);
	}
}
Editor is loading...
Leave a Comment