tcpserv02.c 837 B

12345678910111213141516171819202122232425262728293031323334353637
  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. connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);
  21. if ( (childpid = Fork()) == 0) { /* child process */
  22. Close(listenfd); /* close listening socket */
  23. str_echo(connfd); /* process the request */
  24. exit(0);
  25. }
  26. Close(connfd); /* parent closes connected socket */
  27. }
  28. }