Untitled

 avatar
unknown
plain_text
16 days ago
2.8 kB
4
Indexable
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.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 ] , receiveThread ;
int sockfd ;
struct sockaddr_in addr ;
int windowStart , windowEnd ;
int nextToSend ;
void * sendPacket ( void * sendPacket )
{
Packet * packet = ( Packet *) sendPacket ;
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 ) ;

}

}

void * receivePacket()
{
socklen_t addr_size = sizeof ( addr ) ;
char buffer [1024];

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 ack nowledg ment for packet %d \n 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 a c kn ow le d ge me nt for packet % d \n " , packetID);
packets [ packetID - 1]. sent = 1;
if ( windowStart == packetID - 1)
{
while ( packets [ windowStart ]. sent == 1)
{
windowStart ++;
if ( windowEnd < packetCount )
windowEnd ++;
}
}
}
else
printf (" Client : Invalid message \n ");
}
}
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;
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 ) ;
pthread_create(& receiveThread , NULL , receivePacket , NULL ) ;
windowStart = 0;
windowEnd = windowStart + windowSize - 1;
for ( int i = windowStart ; i <= windowEnd ; ++ i )
pthread_create (& thread [ i ] , NULL , sendPacket , ( void *) & packets [ i ]) ;

nextToSend = windowEnd + 1;
while ( windowStart != windowEnd )
{
if ( nextToSend <= windowEnd && nextToSend < packetCount )
{
pthread_create(&thread [ nextToSend ] , NULL , sendPacket , ( void *) & packets [nextToSend ]);
nextToSend++;
}
}
close ( sockfd ) ;
}
Editor is loading...
Leave a Comment