Q:

How to use epoll instead of select in this code?

In UNIX Network Programming Volume 1:Figure 6-22 ,there is a piece of code as follows:
/* include fig01 */
#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;

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;           /* initialize */
maxi = -1;                  /* index into client[] array */
for (i = 0; i < FD_SETSIZE; i++)
    client[i] = -1;         /* -1 indicates available entry */
FD_ZERO(&allset);
FD_SET(listenfd, &allset);
/* end fig01 */

/* include fig02 */
for ( ; ; ) {
    rset = allset;      /* structure assignment */
    nready = Select(maxfd+1, &rset, NULL, NULL, NULL);

    if (FD_ISSET(listenfd, &rset)) {    /* new client connection */
        clilen = sizeof(cliaddr);
        connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);
#ifdef  NOTDEF
        printf("new client: %s, port %d\n",
                Inet_ntop(AF_INET, &cliaddr.sin_addr, 4, NULL),
                ntohs(cliaddr.sin_port));
#endif

        for (i = 0; i < FD_SETSIZE; i++)
            if (client[i] < 0) {
                client[i] = connfd; /* save descriptor */
                break;
            }
        if (i == FD_SETSIZE)
            err_quit("too many clients");

        FD_SET(connfd, &allset);    /* add new descriptor to set */
        if (connfd > maxfd)
            maxfd = connfd;         /* for select */
        if (i > maxi)
            maxi = i;               /* max index in client[] array */

        if (--nready <= 0)
            continue;               /* no more readable descriptors */
    }

    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) {
                    /*4connection 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 */
        }
    }
}
}
/* end fig02 */

I want to know how to use "epoll" instead "select" in here,But I have little knowledge about epoll,so can anyone give me some points ? Thanks.

A:

You can go through this link. However, Before using epoll you need to be sure of the below points -   

Do you want your system to be targeted as cross platform system (I mean which can be run under multiple operating system?) - Because epoll is available only in Linux system.  
What is your targeted kernel version of Linux? Because epoll is only available in Linux 2.6. In case both these questions are answered and you feel epoll is not a restriction, you can go ahead with this.

HTH!

