tcpservselect03.c 2.1 KB

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