#include <stdarg.h>
#include <stdio.h>
#include <signal.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <sys/select.h>
void sig_child() {
pid_t pid;
int status;
while((pid=waitpid(-1,&status,WNOHANG))>0)
printf("%d terminated!/n",pid);
// while(wait(&status)>0);
}
void dealtcp(int s,struct sockaddr_in *remote) {
int len;
time_t ti;
char buff[128];
printf("connection from: %s:%d/n",inet_ntoa(remote->sin_addr),ntohs(remote->sin_port));
ti=time(NULL);
//snprintf(buff,sizeof(buff),"%s/r/n",ctime(&ti));
while((len=recv(s,buff,sizeof(buff),0))>0) {
buff[len]='/0';
send(s, buff,strlen(buff), 0);
bzero(buff,sizeof(buff));
}
}
int main(int argc, char **argv) {
struct sockaddr_in remote;
char *hname, *sname;
int s, c, len,fd,s1,n;
pid_t pid;
fd_set rset,allset;
int client[1024];
int i,maxi,maxfd,nready;
char buff[1024];
if(argc < 2)
error(1,0,"parameters less than 2");
else if(argc == 2) {
hname = NULL;
sname = argv[1];
}
else if(argc == 3) {
hname = argv[1];
sname = argv[2];
}
s = server(hname, sname,"tcp");
s1 = server(hname, sname,"udp");
signal(SIGCHLD,sig_child);
len = sizeof(struct sockaddr);
maxfd = s>s1?s:s1;
while(1) {
FD_SET(s,&rset);
FD_SET(s1,&rset);
if((nready=select(maxfd+1,&rset,NULL,NULL,NULL))<0)
error(1,0,"select error!!");
if(FD_ISSET(s,&rset)) {
if((c=accept(s,(struct sockaddr *)&remote,&len))<=0){
error(1,errno,"accept error!");
}
if(fork()>0){
close(c);
}
else {
close(s);
dealtcp(c,&remote);
exit(0);
}
}
if(FD_ISSET(s1,&rset)) {
n=recvfrom(s1,buff,sizeof(buff),0,(struct sockaddr *)&remote,&len);
sendto(s1,buff,n,0,(struct sockaddr *)&remote,sizeof(remote));
}
}
close(s);
close(s1);
exit(0);
}