tcpservselect01.c 2.1 KB

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