如何区分同一套接字上的读写事件?

时间:2012-10-03 16:37:54

标签: c sockets epoll

我正在使用epoll来获取有关传入数据的通知。这并不难,因为epoll_wait()返回的所有事件都表明我可以从epoll_event.data.fd(套接字描述符)读取数据。

但现在我想要获得两种类型的通知:接收和发送(套接字可用于发送)。但我不能这样做是因为:

    epoll_event.events返回的
  1. epoll_wait()与我在epoll_ctl()中传递的内容相同。因此,在我的案例中,它包含EPOLLINEPOLLOUT
  2. 此外,如果我尝试在epoll中添加两个套接字(作为EPOLLIN和EPOLLOUT事件),我将获得EEXIST
  3. 每次收到通知时,如果不手动调用select(),如何解决此问题?

2 个答案:

答案 0 :(得分:4)

man epoll_wait明确指出“事件成员将包含返回的事件位字段。”。因此,如果您在EPOLLIN | EPOLLOUT中获得epoll_event.events,那么您的套接字必须准备好进行读写。

如果您只想在套接字更改状态时收到通知,请使用EPOLLET进行边缘触发操作。

答案 1 :(得分:2)

使用epoll_ctl添加描述符时,请将events掩码设置为EPOLLIN | EPOLLOUT

当您通过epoll_wait收到通知时,您将循环查看已返回的通知,检查EPOLLINEPOLLOUT

伪码

int index, count;
count = epoll_wait(epfd, epoll_event, MAX_EVENTS, -1);
for (index = 0; index < count; ++index) {
  if (epoll_event[index].events & EPOLLIN) {
    // Ready for read
  }

  if (epoll_event[index].events & EPOLLOUT) {
    // Ready for write
  }
}

有些人只有在发送缓冲区中存在数据时才设置EPOLLOUT位。我没有包含任何错误检查。