Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 在这段代码中如何使用epoll而不是select?_Unix_Network Programming_Epoll - Fatal编程技术网

Unix 在这段代码中如何使用epoll而不是select?

Unix 在这段代码中如何使用epoll而不是select?,unix,network-programming,epoll,Unix,Network Programming,Epoll,在UNIX网络编程第1卷:图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

在UNIX网络编程第1卷:图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 */
/*包括图01*/
#包括“unp.h”
int main(int argc,字符**argv)
{
int i、maxi、maxfd、listenfd、connfd、sockfd;
int nready,客户端[FD_设置大小];
(三);
fd_集rset,所有集;
char buf[MAXLINE];
socklen_t clilen;
cliaddr、servaddr中的结构sockaddr\u;
listenfd=套接字(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin\u addr.s\u addr=htonl(INADDR\u ANY);
servaddr.sin_port=htons(SERV_port);
绑定(listenfd,(SA*)&servaddr,sizeof(servaddr));
听(listenfd,LISTENQ);
maxfd=listenfd;/*初始化*/
maxi=-1;/*索引到客户端[]数组*/
对于(i=0;imaxfd)
maxfd=connfd;/*用于选择*/
如果(i>maxi)
maxi=i;/*客户端[]数组中的最大索引*/
如果(--nready,您可以进行此操作。但是,在使用epoll之前,您需要确保以下几点-

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

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


  • HTH!

    还有一点需要说明:您想在边缘触发模式下使用epoll还是epoll?除非启用边缘触发模式,否则使用epoll与选择相比没有什么优势。@kumar_m_kiran该链接不再可用。您可以发布一个包含类似内容的链接来共享吗。