Multiplexing Example Program
Multiplexing Example Program
Create listening socket and initialize for select. We create the listening socket
using socket, bind, and listen and initialize our data structures assuming that the
only descriptor that we will select on initially is the listening socket.
Block in select. select waits for something to happen, which is one of the following:
o The establishment of a new client connection.
o The arrival of data on the existing connection.
o A FIN on the existing connection.
o A RST on the existing connection.
accept new connections.
o If the listening socket is readable, a new connection has been established.
o We call accept and update our data structures accordingly. We use the first
unused entry in the client array to record the connected socket.
o The number of ready descriptors is decremented, and if it is 0
(tcpcliserv/tcpservselect01.c#L62), we can avoid the next for loop. This lets us
use the return value from select to avoid checking descriptors that are not
ready.
Check existing connections.
o In the second nested for loop, a test is made for each existing client
connection as to whether or not its descriptor is in the descriptor set returned
by select, and a line is read from the client and echoed back to the client.
Otherwsie, if the client closes the connection, read returns 0 and we update our
data structures accordingly.
o We never decrement the value of maxi, but we could check for this possibility
each time a client closes its connection.
#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 buf[MAXLINE];
socklen_t clilen;
struct sockaddr_in cliaddr, servaddr;
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);
/* include fig02 */
for ( ; ; ) {
rset = allset; /* structure assignment */
nready = Select(maxfd+1, &rset, NULL, NULL, NULL);
if (--nready <= 0)
continue; /* no more readable descriptors
*/
}
if (--nready <= 0)
break; /* no more readable descriptors
*/
}
}
}
}
/* end fig02 */