Unix 在这段代码中如何使用epoll而不是select?
在UNIX网络编程第1卷:图6-22中,有一段代码如下: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
/* 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该链接不再可用。您可以发布一个包含类似内容的链接来共享吗。