tcpservselect01.lc 5.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /* include fig01 */
  2. #include "unp.h"## 1 ##src/tcpcliserv/tcpservselect01.c##
  3. int## 2 ##src/tcpcliserv/tcpservselect01.c##
  4. main(int argc, char **argv)## 3 ##src/tcpcliserv/tcpservselect01.c##
  5. {## 4 ##src/tcpcliserv/tcpservselect01.c##
  6. int i, maxi, maxfd, listenfd, connfd, sockfd;## 5 ##src/tcpcliserv/tcpservselect01.c##
  7. int nready, client[FD_SETSIZE];## 6 ##src/tcpcliserv/tcpservselect01.c##
  8. ssize_t n;## 7 ##src/tcpcliserv/tcpservselect01.c##
  9. fd_set rset, allset;## 8 ##src/tcpcliserv/tcpservselect01.c##
  10. char line[MAXLINE];## 9 ##src/tcpcliserv/tcpservselect01.c##
  11. socklen_t clilen;## 10 ##src/tcpcliserv/tcpservselect01.c##
  12. struct sockaddr_in cliaddr, servaddr;## 11 ##src/tcpcliserv/tcpservselect01.c##
  13. listenfd = Socket(AF_INET, SOCK_STREAM, 0);## 12 ##src/tcpcliserv/tcpservselect01.c##
  14. bzero(&servaddr, sizeof(servaddr));## 13 ##src/tcpcliserv/tcpservselect01.c##
  15. servaddr.sin_family = AF_INET;## 14 ##src/tcpcliserv/tcpservselect01.c##
  16. servaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 15 ##src/tcpcliserv/tcpservselect01.c##
  17. servaddr.sin_port = htons(SERV_PORT);## 16 ##src/tcpcliserv/tcpservselect01.c##
  18. Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));## 17 ##src/tcpcliserv/tcpservselect01.c##
  19. Listen(listenfd, LISTENQ);## 18 ##src/tcpcliserv/tcpservselect01.c##
  20. maxfd = listenfd; /* initialize */## 19 ##src/tcpcliserv/tcpservselect01.c##
  21. maxi = -1; /* index into client[] array */## 20 ##src/tcpcliserv/tcpservselect01.c##
  22. for (i = 0; i < FD_SETSIZE; i++)## 21 ##src/tcpcliserv/tcpservselect01.c##
  23. client[i] = -1; /* -1 indicates available entry */## 22 ##src/tcpcliserv/tcpservselect01.c##
  24. FD_ZERO(&allset);## 23 ##src/tcpcliserv/tcpservselect01.c##
  25. FD_SET(listenfd, &allset);## 24 ##src/tcpcliserv/tcpservselect01.c##
  26. /* end fig01 */
  27. /* include fig02 */
  28. for (;;) {## 25 ##src/tcpcliserv/tcpservselect01.c##
  29. rset = allset; /* structure assignment */## 26 ##src/tcpcliserv/tcpservselect01.c##
  30. nready = Select(maxfd + 1, &rset, NULL, NULL, NULL);## 27 ##src/tcpcliserv/tcpservselect01.c##
  31. if (FD_ISSET(listenfd, &rset)) { /* new client connection */## 28 ##src/tcpcliserv/tcpservselect01.c##
  32. clilen = sizeof(cliaddr);## 29 ##src/tcpcliserv/tcpservselect01.c##
  33. connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);## 30 ##src/tcpcliserv/tcpservselect01.c##
  34. for (i = 0; i < FD_SETSIZE; i++)## 31 ##src/tcpcliserv/tcpservselect01.c##
  35. if (client[i] < 0) {## 32 ##src/tcpcliserv/tcpservselect01.c##
  36. client[i] = connfd; /* save descriptor */## 33 ##src/tcpcliserv/tcpservselect01.c##
  37. break;## 34 ##src/tcpcliserv/tcpservselect01.c##
  38. }## 35 ##src/tcpcliserv/tcpservselect01.c##
  39. if (i == FD_SETSIZE)## 36 ##src/tcpcliserv/tcpservselect01.c##
  40. err_quit("too many clients");## 37 ##src/tcpcliserv/tcpservselect01.c##
  41. FD_SET(connfd, &allset); /* add new descriptor to set */## 38 ##src/tcpcliserv/tcpservselect01.c##
  42. if (connfd > maxfd)## 39 ##src/tcpcliserv/tcpservselect01.c##
  43. maxfd = connfd; /* for select */## 40 ##src/tcpcliserv/tcpservselect01.c##
  44. if (i > maxi)## 41 ##src/tcpcliserv/tcpservselect01.c##
  45. maxi = i; /* max index in client[] array */## 42 ##src/tcpcliserv/tcpservselect01.c##
  46. if (--nready <= 0)## 43 ##src/tcpcliserv/tcpservselect01.c##
  47. continue; /* no more readable descriptors */## 44 ##src/tcpcliserv/tcpservselect01.c##
  48. }## 45 ##src/tcpcliserv/tcpservselect01.c##
  49. for (i = 0; i <= maxi; i++) { /* check all clients for data */## 46 ##src/tcpcliserv/tcpservselect01.c##
  50. if ((sockfd = client[i]) < 0)## 47 ##src/tcpcliserv/tcpservselect01.c##
  51. continue;## 48 ##src/tcpcliserv/tcpservselect01.c##
  52. if (FD_ISSET(sockfd, &rset)) {## 49 ##src/tcpcliserv/tcpservselect01.c##
  53. if ((n = Readline(sockfd, line, MAXLINE)) == 0) {## 50 ##src/tcpcliserv/tcpservselect01.c##
  54. /* 4connection closed by client */## 51 ##src/tcpcliserv/tcpservselect01.c##
  55. Close(sockfd);## 52 ##src/tcpcliserv/tcpservselect01.c##
  56. FD_CLR(sockfd, &allset);## 53 ##src/tcpcliserv/tcpservselect01.c##
  57. client[i] = -1;## 54 ##src/tcpcliserv/tcpservselect01.c##
  58. } else## 55 ##src/tcpcliserv/tcpservselect01.c##
  59. Writen(sockfd, line, n);## 56 ##src/tcpcliserv/tcpservselect01.c##
  60. if (--nready <= 0)## 57 ##src/tcpcliserv/tcpservselect01.c##
  61. break; /* no more readable descriptors */## 58 ##src/tcpcliserv/tcpservselect01.c##
  62. }## 59 ##src/tcpcliserv/tcpservselect01.c##
  63. }## 60 ##src/tcpcliserv/tcpservselect01.c##
  64. }## 61 ##src/tcpcliserv/tcpservselect01.c##
  65. }## 62 ##src/tcpcliserv/tcpservselect01.c##
  66. /* end fig02 */