This is a Multi Protocal Socket programming where server will have tcp as well as udp request . It will manage both request using poll system call . 1. multiserver programe
#include<stdio.h>
#include<unistd.h>
#include<netdb.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<poll.h>
int main()
{
struct pollfd p[2];
int tsfd,usfd,nsfd,tcpsize,udpsize;
int pstatus;
struct sockaddr_in tcpserver,udpserver,tcpclient,udpclient;
tsfd=socket(AF_INET,SOCK_STREAM,0);//tcp socket
if(tsfd==-1)
{printf("socket error");exit(1);}
usfd=socket(AF_INET,SOCK_DGRAM,0);//udp socket
if(usfd==-1)
{printf("socket error");exit(1);}
bzero(&tcpserver,sizeof(tcpserver));
tcpserver.sin_family=AF_INET;
tcpserver.sin_addr.s_addr=INADDR_ANY;
tcpserver.sin_port=htons(1500);
if(bind(tsfd,(struct sockaddr *)&tcpserver,sizeof(tcpserver))==-1)//tcp bind
{printf("bind error\n");exit(1);}
udpserver.sin_family=AF_INET;
udpserver.sin_addr.s_addr=INADDR_ANY;
udpserver.sin_port=htons(2000);
if(bind(usfd,(struct sockaddr *)&udpserver,sizeof(udpserver))==-1)//udp bind
{printf("bind error\n");exit(1);}
listen(tsfd,5);
p[0].events=POLLIN;
p[1].events=POLLIN;
p[0].fd=tsfd;
p[1].fd=usfd;
while(1)
{
pstatus=poll(p,2,2000);//polling tcp and udp connection
if(pstatus>0)
{
if(p[0].revents&POLLIN)//tcp request
{
tcpsize=sizeof(tcpclient);
nsfd=accept(tsfd,(struct sockaddr*)&tcpclient,&tcpsize);//accepting tcp connection
int c=fork();//creating chield for each tcp client
if(c==0)
{
close(tsfd);
char tcpbuf[100];
while(1)
{
recv(nsfd,tcpbuf,100,0);
printf("tcp client says\t%s\n",tcpbuf);
printf("message\n");
memset(tcpbuf,0,100);
gets(tcpbuf);
send(nsfd,tcpbuf,100,0);
memset(tcpbuf,0,100);
}
}
else if(c>0)
close(nsfd);
}
if(p[1].revents&POLLIN)//udp request
{
udpsize=sizeof(udpclient);
char udpbuf[100];
memset(udpbuf,0,100);
recvfrom(usfd,udpbuf,100,0,(struct sockaddr*)&udpclient,&udpsize);
printf("message from %s with port no %d is %s\n",inet_ntoa(udpclient.sin_addr),ntohs(udpclient.sin_port),udpbuf);
memset(udpbuf,0,100);
printf("messge is\n");
gets(udpbuf);
sendto(usfd,udpbuf,100,0,(struct sockaddr *)&udpclient,udpsize);
}
}
}
return 0;
}
2. TCP clint program
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netdb.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include<netinet/in.h>
int main()
{
char buf[100];
int sfd;
sfd=socket(AF_INET,SOCK_STREAM,0);//tcp socket
struct sockaddr_in client;
bzero(&client,sizeof(client));
client.sin_family=AF_INET;
client.sin_addr.s_addr=inet_addr("127.0.0.1");
client.sin_port=htons(1500);
connect(sfd,(struct sockaddr*)&client,sizeof(client));//connecting to server
while(1)
{
memset(buf,0,100);
printf("message\n");
gets(buf);
send(sfd,buf,100,0);
memset(buf,0,100);
recv(sfd,buf,100,0);
printf("server said\t%s\n",buf);
}
return 0;
}
3. UDP clint program
#include<stdio.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<stdlib.h>
#include<string.h>
#include<netdb.h>
int main()
{
char buf[100];
int sfd,size;
sfd=socket(AF_INET,SOCK_DGRAM,0);//udp socket
if(sfd==-1)
{
printf("error in socket");exit(1);}
struct sockaddr_in server,client;
server.sin_family=AF_INET;
server.sin_addr.s_addr=inet_addr("127.0.0.1");
server.sin_port=htons(1500);
size=sizeof(client);
while(1)
{memset(buf,0,100);
printf("your message \n");
gets(buf);
sendto(sfd,buf,100,0,(struct sockaddr *)&server,sizeof(server));
memset(buf,0,100);
recvfrom(sfd,buf,100,0,(struct sockaddr *)&client,&size);
printf("%s\n",buf);
}
return 0;
}
No comments:
Post a Comment