1

在 UNIX Network Programming Volume 1:Figure 6-22 中有一段代码如下:

/* 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 */

我想知道如何在这里使用“epoll”而不是“select”,但是我对epoll知之甚少,所以任何人都可以给我一些积分吗?谢谢。

4

1 回答 1

3

你可以通过这个链接。但是,在使用 epoll 之前,您需要确定以下几点 -

  1. 您是否希望您的系统定位为跨平台系统(我的意思是可以在多个操作系统下运行?) - 因为 epoll 仅在 Linux 系统中可用。

  2. 您的目标 Linux 内核版本是什么?因为 epoll 仅在 Linux 2.6 中可用。如果这两个问题都得到了回答,并且您觉得 epoll 不是限制,您可以继续这样做。

于 2013-03-08T10:57:29.497 回答