tcpserv01.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include "unp.h"
  2. int
  3. main(int argc, char **argv)
  4. {
  5. int listenfd, connfd;
  6. u_char *opts;
  7. pid_t childpid;
  8. socklen_t clilen, len;
  9. struct sockaddr_in cliaddr, servaddr;
  10. void sig_chld(int);
  11. opts = Malloc(44);
  12. listenfd = Socket(AF_INET, SOCK_STREAM, 0);
  13. bzero(&servaddr, sizeof(servaddr));
  14. servaddr.sin_family = AF_INET;
  15. servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  16. servaddr.sin_port = htons(SERV_PORT);
  17. Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
  18. Listen(listenfd, LISTENQ);
  19. Signal(SIGCHLD, sig_chld);
  20. for ( ; ; ) {
  21. clilen = sizeof(cliaddr);
  22. if ( (connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0) {
  23. if (errno == EINTR)
  24. continue; /* back to for() */
  25. else
  26. err_sys("accept error");
  27. }
  28. len = 44;
  29. Getsockopt(connfd, IPPROTO_IP, IP_OPTIONS, opts, &len);
  30. if (len > 0) {
  31. printf("received IP options, len = %d\n", len);
  32. inet_srcrt_print(opts, len);
  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. }