1 #include "unp.h"
2
3 int
main(int argc,char ** argv)4 main(int argc, char **argv)
5 {
6 int listenfd, connfd;
7 pid_t childpid;
8 socklen_t clilen;
9 struct sockaddr_in cliaddr, servaddr;
10 void sig_chld(int);
11
12 listenfd = Socket(AF_INET, SOCK_STREAM, 0);
13
14 bzero(&servaddr, sizeof(servaddr));
15 servaddr.sin_family = AF_INET;
16 servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
17 servaddr.sin_port = htons(SERV_PORT);
18
19 Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
20
21 Listen(listenfd, LISTENQ);
22
23 Signal(SIGCHLD, sig_chld);
24
25 for ( ; ; ) {
26 clilen = sizeof(cliaddr);
27 if ( (connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0) {
28 if (errno == EINTR)
29 continue; /* back to for() */
30 else
31 err_sys("accept error");
32 }
33
34 if ( (childpid = Fork()) == 0) { /* child process */
35 Close(listenfd); /* close listening socket */
36 str_echo(connfd); /* process the request */
37 exit(0);
38 }
39 Close(connfd); /* parent closes connected socket */
40 }
41 }
42