sockets - epoll_data结构存在缺陷,是否需要改进?

标签 sockets network-programming epoll

在epoll上,epoll_data结构很重要

    typedef union epoll_data {
        void *ptr;
        int fd;
        __uint32_t u32;
        __uint64_t u64;
    } epoll_data_t;

如果对于某些事件,我需要将其与一些其他信息相关联,对于epoll_data,我需要构造一个结构,并使用ptr指向该结构。然后在结构中放入fd元素,类似
           typedef {
              int fd;
              char* info;
           } compound;

但是,当我要检查 Activity 事件时,我必须执行以下操作:
for( ; ; )
    {
        nfds = epoll_wait(epfd,events,20,500);
        for(i=0;i<nfds;++i)
        {
            if(events[i].data.fd==listenfd) {
                ...
            }
            else if( ((compound*)events[i].events.ptr)->fd ....){
               ...
            }
    }

检查不一致,有时我需要检查events[i].data.fd,有时我需要检查events[i].data.ptr->fd。如果我将所有事件保持一致,即让所有事件都具有一个无效的ptr,那么对于某些套接字,这是浪费的,因为它们与其他信息无关。

因此我认为epoll_data应该具有独立的int fd元素,因为fd通常非常重要。

您对此有何看法?谢谢!

最佳答案

您始终可以使用存储在epoll_data实例中的文件描述符将索引/键索引到自己的数据数组/哈希中。或者,您始终可以使用该联合的指针成员,并将所有元数据保存在自定义数据结构中。换句话说,您已经可以使其一致。

我认为,最小的OS界面是可取的。

关于sockets - epoll_data结构存在缺陷,是否需要改进?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16654598/

相关文章:

javascript - 在 node.js 上的 socket.io 上发送消息客户端-> 服务器-> 客户端

c - 如何在 freebsd 中监听原始套接字并提取数据

qt - 是否可以获得 Qt 使用的 X11 文件描述符,以便我可以对其执行 poll() ?

c - EPOLLERR 和 EPOLLHUP 的真正含义是什么以及如何处理它们?

sockets - TCP 服务器被只有 "connect"而没有发送任何数据的客户端淹没

java - 应用程序连接到服务器但无法通信

c# - 如何在同一解决方案中将通用 Windows 应用程序与旧版 .Net 4.5 应用程序进行实时通信。工控机?

c++ - RST 数据包是否会被发送到应用程序而不考虑其序列号?

multithreading - 当另一个线程等待这个 epoll 描述符时,我可以将套接字添加到 epoll 描述符吗?

c# - 异步套接字,在同一连接上接收多个文件