如何区分“侦听器”文件描述符和“客户端”文件描述符?epoll:区分“侦听器”FD
下面是我在manpage例子中看到:
if(events[n].data.fd == listener) {
...
} else {
...
}
“但是,如果我没有获得listener
什么?
对不起,如果这是一个模糊的问题。我不太确定如何说出来。
如何区分“侦听器”文件描述符和“客户端”文件描述符?epoll:区分“侦听器”FD
下面是我在manpage例子中看到:
if(events[n].data.fd == listener) {
...
} else {
...
}
“但是,如果我没有获得listener
什么?
对不起,如果这是一个模糊的问题。我不太确定如何说出来。
假设你正在编写一个服务器,您应该围绕一些变量保持监听套接字描述符(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描述符,但它保持在一个地方与一个插座的所有信息的一个很好的属性。
这种方法也可以将一个或多个回调函数与文件描述符相关联。 – Dummy00001 2010-06-28 19:15:12
是的,这是一种......哦,恐怖......面向对象:) – 2010-06-28 19:18:42
当然,你可以在那里适合一个'goto',在某个地方! +1,我也使用小型结构(带* gasp *日志记录回调)。 – 2010-06-28 19:21:37
检查libevent - http://monkey.org/~provos/libevent/ - 确保您不要重新发明轮子。 – Dummy00001 2010-06-28 19:16:17
是的,libevent!状态机规则! – 2010-06-28 19:22:40
我会检查出来;谢谢。 – someguy 2010-06-28 19:51:55