【问题标题】:epoll: Distinguishing "listener" FDsepoll:区分“侦听器”FD
【发布时间】:2010-06-28 18:36:19
【问题描述】:

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

这是我在 manpage 示例中看到的:

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

'但是如果我无法访问 listener 怎么办?

对不起,如果这是一个模糊的问题。我不太清楚如何措辞。

【问题讨论】:

标签: c linux epoll


【解决方案1】:

假设您正在编写服务器,您应该将侦听套接字描述符保留在某个变量中(手册页中的listener),或者为您提供给epoll_ctl(2) 的每个套接字设置一个小结构并指向它使用struct epoll_eventdata.ptr 成员(不要忘记在套接字关闭时取消分配该结构)。

类似这样的:

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

正如您所见,它比仅访问服务器套接字描述符要做的工作要多得多,但它有一个很好的属性,可以将与一个套接字相关的所有信息保存在一个地方。

【讨论】:

  • 这种方式还可以将回调函数与文件描述符相关联。
  • 是的,这有点……哦,可怕的……面向对象的:)
  • 当然你可以在某个地方放一个goto! +1,我还使用小型结构(带有 gasp 记录回调)。
  • 这也是我的想法,但想要一个更简单的解决方案。它会更加复杂,因为我将为客户端会话建立一个单独的结构(不仅包含 fd 和标志)!感觉不对。无论如何,感谢您的帮助。打勾:)
猜你喜欢
  • 2021-07-12
  • 2016-06-27
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 2011-08-16
相关资源
最近更新 更多