我已经能够在你的帮助和阅读其他资源后成功使用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接收,我不知道该怎么做,你能帮忙吗?
答案 0 :(得分:0)
你应该在每个可以发送的FD周围添加一层包装:让它有一些状态表示“就绪”,以及一个本地数据队列。现在创建一个接受数据的接口。如果状态未“准备就绪”,则立即将数据排入队列并返回。否则尝试发送数据(在循环中),如果你点击EAGAIN或EWOULDBLOCK,将其余部分排队并将“ready”设置为false。
同时,在你的主事件循环中,每当你得到一个EPOLLOUT时,进入send
循环以排空队列,如果你没有错误就完成了将“ready”设置为true。 (有了这个逻辑,假设你处于边缘触发模式,EPOLLOUT只应在你的FD没有“准备就绪”时触发。)