2010-06-28 72 views
0

如何区分“侦听器”文件描述符和“客户端”文件描述符?epoll:区分“侦听器”FD

下面是我在manpage例子中看到:

if(events[n].data.fd == listener) { 
    ... 
} else { 
    ... 
} 

“但是,如果我没有获得listener什么?

对不起,如果这是一个模糊的问题。我不太确定如何说出来。

+0

检查libevent - http://monkey.org/~provos/libevent/ - 确保您不要重新发明轮子。 – Dummy00001 2010-06-28 19:16:17

+0

是的,libevent!状态机规则! – 2010-06-28 19:22:40

+0

我会检查出来;谢谢。 – someguy 2010-06-28 19:51:55

回答

3

假设你正在编写一个服务器,您应该围绕一些变量保持监听套接字描述符(listener在手册页),或设置一个小型结构每次给epoll_ctl(2)插座并指向它与data.ptr成员struct epoll_event(当套接字关闭时,不要忘记取消分配该结构)。

事情是这样的:

struct socket_ctl 
{ 
    int fd; /* socket descriptor */ 
    int flags; /* my info about the socket, say (flags&1) != 0 means server */ 
    /* whatever else you want to have here, like pointers to buffers, etc. */ 
}; 
... 
struct socket_ctl* pctl = malloc(sizeof(struct socket_ctl)); 
/* check for NULL */ 
pctl->fd = fd; 
pctl->flags = 1; /* or better some enum or define */ 
struct epoll_event ev; 
ev.events = EPOLLIN|...; 
ev.data.ptr = pctl; 
... 
if ((events[n].data.ptr->flags & 1) != 0) 
{ 
    /* this is server socket */ 
} 

正如你可以看到它的更多的工作那么就能够访问服务器的socket描述符,但它保持在一个地方与一个插座的所有信息的一个很好的属性。

+0

这种方法也可以将一个或多个回调函数与文件描述符相关联。 – Dummy00001 2010-06-28 19:15:12

+0

是的,这是一种......哦,恐怖......面向对象:) – 2010-06-28 19:18:42

+0

当然,你可以在那里适合一个'goto',在某个地方! +1,我也使用小型结构(带* gasp *日志记录回调)。 – 2010-06-28 19:21:37