EPOLLIN并发送没有EPOLLOUT

时间:2013-02-03 22:22:33

标签: c linux epoll

我已经能够在你的帮助和阅读其他资源后成功使用epoll,我现在面临的问题是我需要发送到不同的FD而不是EPOLLOUT事件返回,所以如果我有5个FD,那么我需要发送到1然后发送到4然后再发送到1然后发送到5等等。

以下伪代码是我现在对IN和OUT事件的所有内容,

 while(1) {

 rval = epoll_wait();

    for (i = 0; i < rval; i++) { 
     if (events & EPOLLOUT) {
        //send to the ready FD for sending
      }
     if (events & EPOLLIN) {
        //Receive from ready fd, this part is perfect for my application 
      }
    }
}

我需要做的事情如下

char buff[100];
fd = read_data(buff); // read data ready to send, the return value is the FD the application should send the returned data to 

send(fd, buff, 100, 0); 

然后我需要EPOLLIN从任何FD接收数据,因为我将一直从所有fd接收,我不知道该怎么做,你能帮忙吗?

1 个答案:

答案 0 :(得分:0)

你应该在每个可以发送的FD周围添加一层包装:让它有一些状态表示“就绪”,以及一个本地数据队列。现在创建一个接受数据的接口。如果状态未“准备就绪”,则立即将数据排入队列并返回。否则尝试发送数据(在循环中),如果你点击EAGAIN或EWOULDBLOCK,将其余部分排队并将“ready”设置为false。

同时,在你的主事件循环中,每当你得到一个EPOLLOUT时,进入send循环以排空队列,如果你没有错误就完成了将“ready”设置为true。 (有了这个逻辑,假设你处于边缘触发模式,EPOLLOUT只应在你的FD没有“准备就绪”时触发。)