void serve(int listener){ fd_set master; // master file descriptor list fd_set read_fds; //temp file descriptor list for select() //struct sockaddr_in myaddr; //server address struct sockaddr_in remoteaddr; //client address int fdmax; // maximum file descriptor number //int listener;// listening socket descriptor int newfd; // newly accept()ed socket descriptor char buf[HOST_BUF_LEN]; // buffer for client data int nbytes; int addrlen; int i ; FD_ZERO(&master); // clear the master and temp sets FD_ZERO(&read_fds); FD_SET(listener, &master); //keep track of the biggest file descriptor fdmax = listener; //so far, it's this one //main loop for(;;) { read_fds = master; //copy it if (select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1) { perror("select"); exit(1); } printf ("i = %d\n", listener); //run through the existing connections looking for data to read for(i = 0; i <= fdmax; i++) { //FILE *fd; printf ("i = %d\n", i); int fd; if (FD_ISSET(i, &read_fds)) { //we got one!! if (i == listener) { //handle new connections addrlen = sizeof remoteaddr; if ((newfd = accept(listener, (struct sockaddr *)&remoteaddr, &addrlen)) == -1) { perror("accept"); } else { if (fcntl(i, F_SETFL, O_NONBLOCK) < 0) { perror("fcntl"); } if (setsockopt(i, SOL_SCTP, SCTP_NODELAY, &nodelay, sizeof(nodelay)) < 0) { perror("setsockopt"); } FD_SET(newfd, &master); //add to master set if (newfd > fdmax) { //keep track of the maximum fdmax = newfd; } char name[L_tmpnam]; } } else { //handle data from a client if ((nbytes = recv(i, buf, sizeof buf, MSG_DONTWAIT )) <= 0) { //got error or connection closed by client //connection closed printf("selectserver: socket %d hung up\n", i); } else { perror("recv"); } close(i); //bye! FD_CLR(i, &master); //remove from master set close(fd); } else { while (total <375){ nbytes = recv(i, buf, sizeof buf, MSG_DONTWAIT ); printf(buf); total += 256; } if ((nbytes = recv(i, buf, sizeof buf, MSG_DONTWAIT )) <= 0){close (i);FD_CLR(i, &master);} } } } } } }