EX5:Write a program
to simulate sliding window protocol from server to client using TCP socket
Algorithm:
Server:
1.
Create a socket with the socket() system call.
2. Bind the socket to an address using the bind()
system call. For a server socket on the Internet, an address consists of a port
number on the host machine.
3. Listen for connections with the listen() system
call.
4. Accept a connection with the accept() system
call. This call typically blocks until a client connects with the server.
5.
Send and receive data using the read() and write()
system calls.
6.
Terminate the connections using close() system call.
Client:
1.
Create a socket with the socket() system call.
2. Connect the socket to the address of the server using
the connect() system call.
3.
Send and receive data using the read() and write()
system calls.
4.
Terminate the connections using close() system call.
// SLIDE SERVER //
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define MAX 20
#define N 4
int main( int argc, char *argv[] ) {
int socfd, clifd, addrlen;
char buf[ MAX ];
struct sockaddr_in myaddr;
int sp, cp, ep;
int inputBuf[ MAX ], ACK = -1;
sp = 0;
cp = sp;
ep = sp + N;
if ( (socfd = socket( PF_INET, SOCK_STREAM, 0 )) < 0 )
fprintf( stderr, "socket error\n" );
memset( &myaddr, 0, sizeof( &myaddr ) );
myaddr.sin_family = AF_INET;
myaddr.sin_addr.s_addr = htonl( INADDR_ANY );
myaddr.sin_port = htons( atoi( argv[1] ) );
addrlen = sizeof( myaddr );
if ( bind( socfd, (struct sockaddr *)&myaddr, addrlen ) < 0 )
fprintf( stderr, "bind error\n" );
if ( listen( socfd, 1 ) < 0 )
fprintf( stderr, "listen error\n" );
if ( (clifd = accept( socfd, (struct sockaddr *)&myaddr, &addrlen )) < 0 )
fprintf( stderr, "accept error\n" );
while( cp < MAX ) {
while( cp >= sp && cp <= ep ) {
if( read( clifd, buf, sizeof(buf) ) > 0 ) {
inputBuf[ cp++ ] = atoi( buf );
printf( "%s received\n", buf );
}}if( cp > 0 ) {
sprintf( buf, "%d", cp-1 );
if ( write( clifd, buf, sizeof(buf) ) != sizeof(buf) )
fprintf( stderr, "write error\n" );
else
printf( "sending ACK %s\n", buf );
sp = cp;
ep = sp + N;
}}
return 0;}
Client Program:
// SLIDE CLIENT //
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/select.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define MAX 20
#define N 4
int main( int argc, char *argv[] ) {
int socfd, clifd, addrlen;
char buf[ MAX ];
struct sockaddr_in myaddr;
int i, sp, cp, ep, inputBuf[ MAX ], ACK = -1;
sp = 0;
cp = sp;
ep = sp + N;
for( i=0; i<MAX; i++ )
inputBuf[i] = i;
if ( (socfd = socket( PF_INET, SOCK_STREAM, 0 )) < 0 )
fprintf( stderr, "socket error" );
myaddr.sin_family = AF_INET;
myaddr.sin_addr.s_addr = htonl( INADDR_ANY );
myaddr.sin_port = htons( atoi( argv[1] ) );
addrlen = sizeof( struct sockaddr );
if ( connect( socfd, (struct sockaddr *)&myaddr, addrlen ) < 0 )
fprintf( stderr, "connect error" );
while( cp < MAX ) {
while( cp >= sp && cp <= ep ) {
sprintf( buf, "%d", inputBuf[ cp++ ] );
if ( write( socfd, buf, sizeof(buf) ) != sizeof(buf) )
fprintf( stderr, "write error" );
else
printf( "sending %s\n", buf );
}
if( read( socfd, buf, sizeof(buf) ) > 0 ) {
ACK = atoi( buf );
printf( "ACK %d received\n", ACK );
sp = ACK+1;
ep = sp + N;
} }return 0;
}
Output:
server side:
[anandh@tecnetserver slide]$ cc slides.c -o server
[anandh@tecnetserver slide]$ ./server 5000
0 received
1 received
2 received
3 received
4 received
sending ACK 4
5 received
6 received
7 received
8 received
9 received
sending ACK 9
clientside:
[anandh@tecnetserver slide]$ cc slidec.c -o client
[anandh@tecnetserver slide]$ ./client 5000
sending 0
sending 1
sending 2
sending 3
sending 4
ACK 4 received
sending 5
sending 6
sending 7
sending 8
sending 9
ACK 9 received