Stuff
public text v1 · immutablevoid 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);}
}
}
}
}
}
}