问题:对epoll_event结构成员data.ptr赋值引发的问题(已解决)

       在写一个socket程序时候, 希望实现 fd 与 类对象的相互绑定。这样每次fd有读写事件到时候都能够使用同一个对象处理。简单的说,就是每个fd对应到一个连接用户。

  我的做法很普通,调用epoll_ctl函数时对epoll_event的data.ptr赋值成对象指针就可以了(实际上我看别人的代码也是那么做的)。当然,我也有注意到data成员是联合体,所以我只是给data.ptr赋值,并没有网上所说data.ptr与data.fd都赋值造成值覆盖的情况。

int event_add(int epollfd, int fd, unsigned int events, void *data)
{
    struct epoll_event ev;
    ev.data.ptr = data;
    ev.events = events;
    return epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &ev);
}

// 调用
Task *newtask = new Task();
event_add(epfd, sockfd, EPOLLIN | EPOLLET, static_cast<void *>(newtask));

  按理说,这样写之后期望的结果应该在epoll_wait返回之后,可以通过event[i].data.ptr能够获取到绑定对象,继续处理逻辑。

while (true)
{   int nready = epoll_wait(epollfd, clients, MAXEVENTSIZE, -1);   for (int i = 0; i < nready; i++) {   int fd = clients[i].data.fd; if ((fd == listenfd) && (clients[i].events & EPOLLIN)) do_accept(epollfd, listenfd); else if (clients[i].events & EPOLLIN) {
      cout << "epoll_wait fd ---> " << fd << endl;
      Task *t = (Task *)clients[i].data.ptr; // 获取绑定对象
      t->exec();
    }
  }
}


  但是结果就很奇怪,在上面代码cout处,终端得到的结果一直是一串特别长的数值。断点查看新连接socket得到fd的值, 没有问题,正常传值。这个问题先留着。。。暂时没定位到问题。。。

 

!!!clients[i].data.fd这里错了, 因为就没对它赋值, 应该通过Task *task = clients[i].data.ptr,task->getFd();获取!!!太傻了。。。

posted @ 2020-07-18 10:53  hongfua  阅读(1233)  评论(0编辑  收藏  举报