All pastes #986413 Raw Edit

Stuff

public text v1 · immutable
·published 2008-04-15 19:58 UTC
rendered paste body
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);}
                                        }
                                }
                        }
                }
        }
}