Thursday, 26 September 2013

Internet Super Server


In This program Server Will use Select System call To manage The TCP And UDP Request From Client . See Here About Select System call This Concept is used widely used in internet . This is Called Internet Super Server

1. Server program using fork
#include<stdio.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/select.h>
#include<sys/types.h>
#include<netdb.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<errno.h>
int main()
{
int i,j,tsfd[5],usfd[5];
struct sockaddr_in server_tcp,server_udp,client_tcp,client_udp;


for(i=0;i<5;i++)
{

tsfd[i]=socket(AF_INET,SOCK_STREAM,0);//creating 5 tcp socket
if(tsfd[i]==-1)
{

perror("tcp socket");exit(1);
}
server_tcp.sin_family=AF_INET;
server_tcp.sin_port=htons(1500+i);
server_tcp.sin_addr.s_addr=INADDR_ANY;
if(bind(tsfd[i],(struct sockaddr *)&server_tcp,sizeof(server_tcp))==-1)//binding tcp socket
{perror("tcp bind error");exit(1);}
listen(tsfd[i],5);
usfd[i]=socket(AF_INET,SOCK_DGRAM,0);//creating 5 udp socket
if(usfd[i]==-1)
{
perror("udp socket");exit(1);
}
server_udp.sin_family=AF_INET;
server_udp.sin_port=htons(2000+i);
server_udp.sin_addr.s_addr=INADDR_ANY;
if(bind(usfd[i],(struct sockaddr *)&server_udp,sizeof(server_udp))==-1)//binding udp socket
{perror("udp bind error");exit(1);}
}
struct timeval tv;
tv.tv_sec=10;
tv.tv_usec=0;
fd_set rd,wr,er;//set fd  for read write and error
FD_ZERO(&rd);
FD_ZERO(&wr);
FD_ZERO(&er);
while(1)
{

for(i=0;i<5;i++)
{
FD_SET(tsfd[i],&rd);
FD_SET(usfd[i],&rd);
}

int f=select(FD_SETSIZE,&rd,NULL,NULL,&tv);//selecting tcp  or udp request  based on parameters
for(i=0;i<5;i++)
{

int length;
if(FD_ISSET(tsfd[i],&rd))//checking which tcp request is active

{
length=sizeof(client_tcp);
int nsfd=accept(tsfd[i],(struct sockaddr *)&client_tcp,&length);//accepting tcp request
if(nsfd==-1)
{printf("accept error");exit(1);
}
int k=fork();
if(k==0)
{
for(j=0;j<5;j++)
     close(tsfd[j]);

    dup2(nsfd,0);//duplicating file discriptor to read
    dup2(nsfd,1);//duplicating file discriptor to write
    execl("./s1",NULL,NULL);//calling another application  ./s1 is not added here u can add any executable program here


}
else
close(nsfd);
tv.tv_sec=10;
tv.tv_usec=0;
FD_CLR(tsfd[i],&rd);

}

if(FD_ISSET(usfd[i],&rd))//checking which udp request came
{length=sizeof(client_udp);
int k=fork();
   if(k==0)
   {
    char buf[100];
    recvfrom(usfd[i],buf,100,0,(struct sockaddr*)&client_udp,&length);
    printf("msg received from %d in udp is %s\n",i,buf);
gets(buf);
sendto(usfd[i],buf,100,0,(struct sockaddr*)&client_udp,length);

   }
   tv.tv_sec=10;
   tv.tv_usec=0;
   FD_CLR(usfd[i],&rd);

}

else
{
printf("NO DATA AVAILABLE in recent 10 seconds\n");
                   tv.tv_sec = 10;
                   tv.tv_usec = 0;

}
}
}
return 0;
}



2. Server program using Pthread //light weight process

#include<stdio.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/select.h>
#include<sys/types.h>
#include<netdb.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<errno.h>

void *tcp_service(void *arg)//thread for tcp service
{
 printf("thread\n");
 char buf[100];
 int nsfd=*(int *)arg;
 //while(1)
 //{
 recv(nsfd,buf,100,0);
 printf("msg rcvd is:%s\n",buf);
 gets(buf);
 send(nsfd,buf,100,0);
 //}
}


char buf1[100];
void *udp_service(void *arg)//thread for udp service
{       printf("thread\n");
 int udp=*(int *)arg;
 struct sockaddr_in client1;
 int length1;
 recvfrom(udp,buf1,100,0,(struct sockaddr*)&client1,&length1);
    printf("msg received from in udp is %s\n",buf1);
 gets(buf1);
 sendto(udp,buf1,100,0,(struct sockaddr*)&client1,sizeof(client1));
}





int main()
{
int i,j,tsfd[5],usfd[5];
struct sockaddr_in server_tcp,server_udp,client_tcp,client_udp;


for(i=0;i<5;i++)
{

tsfd[i]=socket(AF_INET,SOCK_STREAM,0);//creating 5 tcp socket
if(tsfd[i]==-1)
{

perror("tcp socket");exit(1);
}
server_tcp.sin_family=AF_INET;
server_tcp.sin_port=htons(1500+i);
server_tcp.sin_addr.s_addr=INADDR_ANY;
if(bind(tsfd[i],(struct sockaddr *)&server_tcp,sizeof(server_tcp))==-1)//binding tcp socket
{perror("tcp bind error");exit(1);}
listen(tsfd[i],5);
usfd[i]=socket(AF_INET,SOCK_DGRAM,0);//creating 5 udp socket
if(usfd[i]==-1)
{
perror("udp socket");exit(1);
}
server_udp.sin_family=AF_INET;
server_udp.sin_port=htons(2000+i);
server_udp.sin_addr.s_addr=INADDR_ANY;
if(bind(usfd[i],(struct sockaddr *)&server_udp,sizeof(server_udp))==-1)//binding udp socket
{perror("udp bind error");exit(1);}
}
struct timeval tv;
tv.tv_sec=10;
tv.tv_usec=0;
fd_set rd,wr,er;
FD_ZERO(&rd);
FD_ZERO(&wr);
FD_ZERO(&er);
while(1)
{

for(i=0;i<5;i++)
{
FD_SET(tsfd[i],&rd);
FD_SET(usfd[i],&rd);
}

int f=select(FD_SETSIZE,&rd,NULL,NULL,&tv);//select system call
for(i=0;i<5;i++)
{

int length;
if(FD_ISSET(tsfd[i],&rd))//checking which tcp  is active

{
length=sizeof(client_tcp);
int nsfd=accept(tsfd[i],(struct sockaddr *)&client_tcp,&length);
if(nsfd==-1)
{printf("accept error");exit(1);
}
pthread_t p;
   
   pthread_create(&p,NULL,&tcp_service,(void *)&nsfd);//creating tcp thread
   pthread_join(p,NULL);
  
   
   tv.tv_sec=10;
   tv.tv_usec=0;
   FD_CLR(tsfd[i],&rd);
}

if(FD_ISSET(usfd[i],&rd))//checking which udp is active
{
pthread_t p;
char buf[100];
pthread_create(&p,NULL,&udp_service,(void *)&usfd[i]);//creating udp thread
pthread_join(p,NULL);
    
tv.tv_sec=10;
tv.tv_usec=0;
FD_CLR(usfd[i],&rd);

}

}
}
return 0;
}



3. TCP Client
#include<sys/socket.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<netdb.h>
#include<netinet/in.h>
#include<string.h>
int main()
{
 char msg[100],msg1[100];
 int k,c;
 int sfd=socket(AF_INET,SOCK_STREAM,0);
 struct sockaddr_in client;
 client.sin_family=AF_INET;
 client.sin_addr.s_addr=INADDR_ANY;
 printf("enter the port  number u want from 1500 to 1504\n");
 scanf("%d\n",&k);
 client.sin_port=htons(k);
 connect(sfd,(struct sockaddr *)&client,sizeof(client));
  //while(1)
  //{
  printf("enter msg\n");
  
  gets(msg);
  printf("sent msg is:%s\n",msg);
  send(sfd,msg,100,0);
  recv(sfd,msg1,100,0);
  printf("msg received is %s\n",msg1);
  //}
 
 
 return 0;
}



4. UDP Clint
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main()
{
 int length,k;
 char buf[100];
 struct sockaddr_in client,server;
 int sfd=socket(AF_INET,SOCK_DGRAM,0);
 server.sin_family=AF_INET;
 printf("enter port no in b/w 2000 to 2004 to be connected\n");
 scanf("%d\n",&k);
 server.sin_port=htons(k);
 server.sin_addr.s_addr=inet_addr("127.0.0.1");
 length=sizeof(server);
 
 while(1)
 {
 gets(buf);
 if(sendto(sfd,buf,100,0,(struct sockaddr *)&server,(sizeof(server)))==-1)
  printf("error %s\n",strerror(errno));
printf("msg sent :%s\n",buf);
 if(recvfrom(sfd,buf,100,0,(struct sockaddr *)&server,&length)==-1)
  printf("recv error\n");
 printf("msg receved is:%s\n",buf);
 }
 return 0;
}
 


No comments:

Post a Comment