#include "unp.h" void str_echo(int); void sig_chld(int); int main(int argc, char *argv[]) { int listenfd, confd; pid_t childpid; socklen_t clilen; 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); Bind(listenfd, (SA *)&servaddr, sizeof(servaddr)); Listen(listenfd, LISTENQ); Signal(SIGCHLD, sig_chld); for(;;) { clilen = sizeof(cliaddr); if((confd = accept(listenfd, (SA *) &cliaddr, &clilen))< 0 ) { if (errno == EINTR) continue; // back to for() else err_sys("accept error"); } if((childpid = Fork()) == 0) { // child process Close(listenfd); // close listening socket str_echo(confd); exit(0); } Close(confd); // parent close connected socket } } void str_echo(int sockfd) { ssize_t n; char buf[MAXLINE]; again: while((n = read(sockfd, buf, MAXLINE)) > 0) Writen(sockfd, buf, n); if(n < 0 && errno == EINTR) goto again; else if (n < 0) err_sys("str echo: read error"); } void sig_chld(int signo) { pid_t pid; int stat; pid = wait(&stat); printf("child %d terminated\n", pid); return; }