Tcpudpmultiplexing

You might also like

Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 3

#include<stdio.

h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/select.h>
#include<sys/time.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<fcntl.h>
#include<signal.h>
#define MAXLINE 1000
#define SERV_PORT 56792
void sig_child(int);
void str_echo(int);
int max(int,int);
int main(int argc,char **argv)
{
int listenfd,connfd,udpfd,nready,maxfdpl,n;
char msg[MAXLINE];
pid_t childpid;
fd_set rset;
ssize_t len;
const int on=1;
struct sockaddr_in cliaddr,servaddr;
listenfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(SERV_PORT);
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
listen(listenfd,5);
udpfd=socket(AF_INET,SOCK_DGRAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(SERV_PORT);
bind(udpfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
signal(SIGCHLD,sig_child);
FD_ZERO(&rset);
maxfdpl=max(listenfd,udpfd)+1;
for(;;)
{
FD_SET(listenfd,&rset);
FD_SET(udpfd,&rset);
if((nready=select(maxfdpl,&rset,NULL,NULL,NULL))<0)
{
if(errno==EINTR)
continue;
else
printf("select error");
}
if(FD_ISSET(listenfd,&rset))
{
len=sizeof(cliaddr);
connfd=accept(listenfd,(struct sockaddr*)&cliaddr,&len);
if((childpid=fork())==0)
{
close(listenfd);
str_echo(connfd);
exit(0);
}
close(connfd);
}
if(FD_ISSET(udpfd,&rset))
{
len=sizeof(cliaddr);
n=recvfrom(udpfd,msg,MAXLINE,0,(struct sockaddr*)&cliaddr,&len);
sendto(udpfd,msg,n,0,(struct sockaddr*)&cliaddr,len);
printf("data received %s",msg);
}
}
}
void str_echo(int sockfd)
{
ssize_t n;
char buf[1024];
again:
while((n=read(sockfd,buf,1024))>0)
write(sockfd,buf,n);
if(n<0&&errno==EINTR)
goto again;
else if(n<0)
printf("str_echo:readerror");
else
printf("data is %s",buf);
}

void sig_child(int signo)


{
pid_t pid;
int stat;
pid=wait(&stat);
printf("child %s is terminated\n",pid);
return;
}
int max(int a,int b)
{
if(a>b)
return(a);
else
return(b);
}

You might also like