#include "unp.h" int main(int argc, char *argv[]) { int listenfd, confd, sockfd, maxfd, maxi, i; int nready, client[FD_SETSIZE]; ssize_t n; fd_set rset, allset; char buf[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; // initalize maxi = -1; // index into client[] array for(i = 0; i maxfd) maxfd = confd; // for select if( i > maxi) maxi = i; // max index in client[] array if(--nready <= 0) continue; // no more readable descriptor } for(i = 0; i <= maxi; i++) { // check all clients for data if((sockfd = client[i]) < 0) continue; if(FD_ISSET(sockfd, &rset)) { if( (n = Read(sockfd, buf, MAXLINE)) == 0) { // connection closed by client Close(sockfd); FD_CLR(sockfd, &allset); client[i] = -1; } else { Writen(sockfd, buf, n); } if(--nready <= 0) break; // no more readable descriptors } } } }