tcpserv02.c 949 B

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