| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- #include "unp.h"
- int
- main(int argc, char **argv)
- {
- int i, maxi, maxfd, listenfd, connfd, sockfd;
- int nready, client[FD_SETSIZE];
- ssize_t n;
- fd_set rset, allset;
- char line[MAXLINE];
- socklen_t clilen;
- struct sockaddr_in cliaddr, servaddr;
- listenfd = Socket(AF_INET, SOCK_STREAM, 0);
- bzero(&servaddr, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- servaddr.sin_port = htons(SERV_PORT);
- Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
- Listen(listenfd, LISTENQ);
- maxfd = listenfd; /* initialize */
- maxi = -1; /* index into client[] array */
- for (i = 0; i < FD_SETSIZE; i++)
- client[i] = -1; /* -1 indicates available entry */
- FD_ZERO(&allset);
- FD_SET(listenfd, &allset);
- for ( ; ; ) {
- rset = allset;
- nready = Select(maxfd+1, &rset, NULL, NULL, NULL);
- if (FD_ISSET(listenfd, &rset)) { /* new client connection */
- printf("listening socket readable\n");
- sleep(5);
- clilen = sizeof(cliaddr);
- connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);
- #ifdef NOTDEF
- printf("new client: %s, port %d\n",
- Inet_ntop(AF_INET, &cliaddr.sin_addr, 4, NULL),
- ntohs(cliaddr.sin_port));
- #endif
- for (i = 0; i < FD_SETSIZE; i++)
- if (client[i] < 0) {
- client[i] = connfd; /* save descriptor */
- break;
- }
- if (i == FD_SETSIZE)
- err_quit("too many clients");
- FD_SET(connfd, &allset); /* add new descriptor to set */
- if (connfd > maxfd)
- maxfd = connfd; /* for select */
- if (i > maxi)
- maxi = i; /* max index in client[] array */
- if (--nready <= 0)
- continue; /* no more readable descriptors */
- }
- for (i = 0; i <= maxi; i++) { /* check all clients for data */
- if ( (sockfd = client[i]) < 0)
- continue;
- if (FD_ISSET(sockfd, &rset)) {
- if ( (n = Readline(sockfd, line, MAXLINE)) == 0) {
- /* connection closed by client */
- Close(sockfd);
- FD_CLR(sockfd, &allset);
- client[i] = -1;
- }
- Writen(sockfd, line, n);
- if (--nready <= 0)
- break; /* no more readable descriptors */
- }
- }
- }
- }
|