Thursday, 26 September 2013

MultiThreaded MultiProcess MultiProtocol Server /Apache Server


In this program we are going to see the concept used to build apache server . That is also called MMM Server.

1.MMM Server
#include<sys/socket.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
#include<netdb.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<pthread.h>
#include<string.h>
#include<stdlib.h>
#include<fcntl.h>
char mainbuf[100];
int count=1;
int tsfd[5],usfd[5];
struct sockaddr_in server_tcp,server_udp,client_tcp,client_udp;
void *tcp_service(void *arg)
{
 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)
{       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));
}


void *fun(void *arg)

{

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)
{
int i;
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);
for(i=0;i<5;i++)
{

int length;
if(FD_ISSET(tsfd[i],&rd))

{
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);
   pthread_join(p,NULL);
  
   
   tv.tv_sec=10;
   tv.tv_usec=0;
   FD_CLR(tsfd[i],&rd);
}

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

}

}
}
}
int main()
{int c;
int a=mkfifo("/home/gaurav/cn/assign10/msg.txt",0666);
if(a==-1)
{printf("fifo error");exit(1);}
int i,j;



for(i=0;i<5;i++)
{
tsfd[i]=socket(AF_INET,SOCK_STREAM,0);
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)
{perror("tcp bind error");exit(1);}
listen(tsfd[i],5);
usfd[i]=socket(AF_INET,SOCK_DGRAM,0);
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)
{perror("udp bind error");exit(1);}
}


for(i=0;i<10;i++)
{
c=fork();
if(c==0)
{
pthread_t p[10];
int j;
for(j=0;j<10;j++)
{
pthread_create(&p[j],NULL,&fun,&count);count=count+1;}

for(j=0;j<10;j++)
pthread_join(p[j],NULL);
}

}
if(c>0)
{

while(1)
{

int b=open("/home/gaurav/cn/assign10/msg.txt",O_RDWR);
read(b,mainbuf,100);
printf("in main process%s\n",mainbuf);
memset(mainbuf,0,100);

}
}




return 0;
}




2. 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;
}



3. UDP CLient
#include<stdlib.h>
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<pthread.h>
#include<netinet/in.h>
#include<errno.h>
#include<string.h>
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