gpt4 book ai didi

c++ - epoll数据结构中同时使用void *ptr和int fd

转载 作者:太空宇宙 更新时间:2023-11-04 03:47:36 26 4
gpt4 key购买 nike

我正在使用 epoll 系统调用来处理 TCP session 中的多个客户端。

我已经向 fd 注册了 epoll:

epoll_ctl (efd, EPOLL_CTL_ADD, fd, &event);

并且能够与比较 fd 一起使用:

if(conn->getSockfd() == events[i].data.fd)
// ....

但是作为epoll数据结构

typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;

我想将一个对象(函数)映射到特定的fd字段,这样我就可以在比较后调用这个函数。

但我没有得到正确的结果。可以做还是不可以?如果是的话我可以使用它吗?

最佳答案

您正在为 epoll_data_t 使用 union 。所以它一次只能存储其中一个字段。所以要么你的 void*,int,等等。

我注意到你用 C++ 标记了你的问题,所以我将解决这个问题:

您可以将描述符和函数在类/结构中绑定(bind)在一起,然后为您接受/创建的每个连接创建一个新实例。在构造过程中,您可以将 FD 和函数传递到新对象中。

这是一个快速且未经测试的概念:

template < typename FunctionType >
struct Connection
{
int FD;
std::function< FunctionType > DoStuff;

Connection( int descriptor, const std::function< FunctionType >& Func )
: FD ( descriptor )
, DoStuff ( Func )
}

然后,您可以调用构造函数,将文件描述符和要使用 std::bind 执行的函数传递给它,然后通过执行 Connection.DoStuff() 来调用它。

如果您使用占位符等,您可以使用参数等。欲了解更多信息std::bindstd::function点击超链接。

关于c++ - epoll数据结构中同时使用void *ptr和int fd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27565875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com