tcpservpoll01.lc 5.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /* include fig01 */
  2. #include "unp.h"## 1 ##src/tcpcliserv/tcpservpoll01.c##
  3. #include <limits.h> /* for OPEN_MAX */## 2 ##src/tcpcliserv/tcpservpoll01.c##
  4. int## 3 ##src/tcpcliserv/tcpservpoll01.c##
  5. main(int argc, char **argv)## 4 ##src/tcpcliserv/tcpservpoll01.c##
  6. {## 5 ##src/tcpcliserv/tcpservpoll01.c##
  7. int i, maxi, listenfd, connfd, sockfd;## 6 ##src/tcpcliserv/tcpservpoll01.c##
  8. int nready;## 7 ##src/tcpcliserv/tcpservpoll01.c##
  9. ssize_t n;## 8 ##src/tcpcliserv/tcpservpoll01.c##
  10. char line[MAXLINE];## 9 ##src/tcpcliserv/tcpservpoll01.c##
  11. socklen_t clilen;## 10 ##src/tcpcliserv/tcpservpoll01.c##
  12. struct pollfd client[OPEN_MAX];## 11 ##src/tcpcliserv/tcpservpoll01.c##
  13. struct sockaddr_in cliaddr, servaddr;## 12 ##src/tcpcliserv/tcpservpoll01.c##
  14. listenfd = Socket(AF_INET, SOCK_STREAM, 0);## 13 ##src/tcpcliserv/tcpservpoll01.c##
  15. bzero(&servaddr, sizeof(servaddr));## 14 ##src/tcpcliserv/tcpservpoll01.c##
  16. servaddr.sin_family = AF_INET;## 15 ##src/tcpcliserv/tcpservpoll01.c##
  17. servaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 16 ##src/tcpcliserv/tcpservpoll01.c##
  18. servaddr.sin_port = htons(SERV_PORT);## 17 ##src/tcpcliserv/tcpservpoll01.c##
  19. Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));## 18 ##src/tcpcliserv/tcpservpoll01.c##
  20. Listen(listenfd, LISTENQ);## 19 ##src/tcpcliserv/tcpservpoll01.c##
  21. client[0].fd = listenfd;## 20 ##src/tcpcliserv/tcpservpoll01.c##
  22. client[0].events = POLLRDNORM;## 21 ##src/tcpcliserv/tcpservpoll01.c##
  23. for (i = 1; i < OPEN_MAX; i++)## 22 ##src/tcpcliserv/tcpservpoll01.c##
  24. client[i].fd = -1; /* -1 indicates available entry */## 23 ##src/tcpcliserv/tcpservpoll01.c##
  25. maxi = 0; /* max index into client[] array */## 24 ##src/tcpcliserv/tcpservpoll01.c##
  26. /* end fig01 */
  27. /* include fig02 */
  28. for (;;) {## 25 ##src/tcpcliserv/tcpservpoll01.c##
  29. nready = Poll(client, maxi + 1, INFTIM);## 26 ##src/tcpcliserv/tcpservpoll01.c##
  30. if (client[0].revents & POLLRDNORM) { /* new client connection */## 27 ##src/tcpcliserv/tcpservpoll01.c##
  31. clilen = sizeof(cliaddr);## 28 ##src/tcpcliserv/tcpservpoll01.c##
  32. connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);## 29 ##src/tcpcliserv/tcpservpoll01.c##
  33. for (i = 1; i < OPEN_MAX; i++)## 30 ##src/tcpcliserv/tcpservpoll01.c##
  34. if (client[i].fd < 0) {## 31 ##src/tcpcliserv/tcpservpoll01.c##
  35. client[i].fd = connfd; /* save descriptor */## 32 ##src/tcpcliserv/tcpservpoll01.c##
  36. break;## 33 ##src/tcpcliserv/tcpservpoll01.c##
  37. }## 34 ##src/tcpcliserv/tcpservpoll01.c##
  38. if (i == OPEN_MAX)## 35 ##src/tcpcliserv/tcpservpoll01.c##
  39. err_quit("too many clients");## 36 ##src/tcpcliserv/tcpservpoll01.c##
  40. client[i].events = POLLRDNORM;## 37 ##src/tcpcliserv/tcpservpoll01.c##
  41. if (i > maxi)## 38 ##src/tcpcliserv/tcpservpoll01.c##
  42. maxi = i; /* max index in client[] array */## 39 ##src/tcpcliserv/tcpservpoll01.c##
  43. if (--nready <= 0)## 40 ##src/tcpcliserv/tcpservpoll01.c##
  44. continue; /* no more readable descriptors */## 41 ##src/tcpcliserv/tcpservpoll01.c##
  45. }## 42 ##src/tcpcliserv/tcpservpoll01.c##
  46. for (i = 1; i <= maxi; i++) { /* check all clients for data */## 43 ##src/tcpcliserv/tcpservpoll01.c##
  47. if ((sockfd = client[i].fd) < 0)## 44 ##src/tcpcliserv/tcpservpoll01.c##
  48. continue;## 45 ##src/tcpcliserv/tcpservpoll01.c##
  49. if (client[i].revents & (POLLRDNORM | POLLERR)) {## 46 ##src/tcpcliserv/tcpservpoll01.c##
  50. if ((n = readline(sockfd, line, MAXLINE)) < 0) {## 47 ##src/tcpcliserv/tcpservpoll01.c##
  51. if (errno == ECONNRESET) {## 48 ##src/tcpcliserv/tcpservpoll01.c##
  52. /* 4connection reset by client */## 49 ##src/tcpcliserv/tcpservpoll01.c##
  53. Close(sockfd);## 50 ##src/tcpcliserv/tcpservpoll01.c##
  54. client[i].fd = -1;## 51 ##src/tcpcliserv/tcpservpoll01.c##
  55. } else## 52 ##src/tcpcliserv/tcpservpoll01.c##
  56. err_sys("readline error");## 53 ##src/tcpcliserv/tcpservpoll01.c##
  57. } else if (n == 0) {## 54 ##src/tcpcliserv/tcpservpoll01.c##
  58. /* 4connection closed by client */## 55 ##src/tcpcliserv/tcpservpoll01.c##
  59. Close(sockfd);## 56 ##src/tcpcliserv/tcpservpoll01.c##
  60. client[i].fd = -1;## 57 ##src/tcpcliserv/tcpservpoll01.c##
  61. } else## 58 ##src/tcpcliserv/tcpservpoll01.c##
  62. Writen(sockfd, line, n);## 59 ##src/tcpcliserv/tcpservpoll01.c##
  63. if (--nready <= 0)## 60 ##src/tcpcliserv/tcpservpoll01.c##
  64. break; /* no more readable descriptors */## 61 ##src/tcpcliserv/tcpservpoll01.c##
  65. }## 62 ##src/tcpcliserv/tcpservpoll01.c##
  66. }## 63 ##src/tcpcliserv/tcpservpoll01.c##
  67. }## 64 ##src/tcpcliserv/tcpservpoll01.c##
  68. }## 65 ##src/tcpcliserv/tcpservpoll01.c##
  69. /* end fig02 */