0

在您的帮助和阅读其他资源之后,我已经能够成功使用 epoll,我现在面临的问题是我需要发送到与 EPOLLOUT 事件返回不同的 FD,所以如果我有 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 接收数据,我不知道该怎么做,你能帮忙吗?

4

1 回答 1

0

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

同时,在你的主事件循环中,每当你得到一个 EPOLLOUT 时,进入一个send循环来排空队列,如果你没有错误地完成,则将“准备好”设置为 true。(根据这个逻辑,EPOLLOUT 应该只在您的 FD 未“准备好”时触发,假设您处于边沿触发模式。)

于 2013-02-03T22:26:06.553 回答