【问题标题】:How to efficiently map an epoll fd to a context?如何有效地将 epoll fd 映射到上下文?
【发布时间】:2022-01-06 19:54:25
【问题描述】:

假设有一个典型的上下文结构包含有关套接字连接的信息。

struct widget_ctx_t{
    int socket;
    char widgetname[MAXWIDGET];
    ...
}

假设有数千个到小部件的连接,所有连接都有相应的上下文。

struct widget_ctx_t Widgets[5000]

根据我的阅读,epoll 应该用于监视Widgets 中的所有套接字。当数据发送到epoll时,epoll会返回socket。

这是否意味着当epoll返回一个套接字文件描述符时,我需要搜索所有Widgets才能找到具有文件描述符的那个吗?即:

if (events[n].events & EPOLLIN) {
    for(int i = 0; i < MAXWIDGET; i++ ){
            if(events[n].data.fd == Widgets[i].socket){
                //Ok so that is the context to this socket
        }
    }
...
}

或者有没有办法让 epoll 为我提供这个上下文?

【问题讨论】:

    标签: c linux posix epoll


    【解决方案1】:

    epoll_event 结构的data 成员是一个具有几个不同字段的联合,包括一个void *ptr。使用它而不是fd - 在使用epoll_ctl() 将描述符添加到监视列表时,将相关widget_ctx_t 对象的地址分配给它,并在处理epoll_wait() 返回的事件时使用它:

    struct epoll_event event;
    event.events = EPOLLIN | EPOLLOUT;
    event.data.ptr = &Widgets[n];
    epoll_ctl(epfd, EPOLL_CTL_ADD, Widgets[n].socket, &event);
    

    以后

    if (events[n].events & EPOLLIN) {
        struct widget_ctx_t *ctx = events[n].data.ptr;
        // Do something with ctx
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 2020-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      相关资源
      最近更新 更多