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