gpt4 book ai didi

c - Libev - I/O 回调

转载 作者:太空狗 更新时间:2023-10-29 11:46:41 25 4
gpt4 key购买 nike

我有一个使用 TCP 套接字的 C/Linux 聊天服务器。使用 libev 时,我可以为套接字创建一个 ev_io 观察器来读取一次事件。像这样的东西:

ev_io* new_watcher = (ev_io*)malloc(sizeof(ev_io));

//initialize the watcher
ev_init(new_watcher, read_cb);

//set the fd and event to fire on write
ev_io_set(new_watcher, watcher->fd, EV_READ);

//start watching
ev_io_start(loop, new_watcher);

这很好用,因为读取事件只会在有数据要读取时触发。但是,我必须以不同的方式对待写入事件,因为即使我没有要写入的数据,它们也会不断触发。为了解决这个问题,我让我的 read_callback 仅在有数据准备好写入时为写入数据创建一个 ev_io 观察器,然后 write_callback 将在它发送消息后删除观察器。

这意味着每次我需要处理一条消息时,我都会分配、初始化、设置、监视、取消监视和解除分配写监视程序。我担心我可能处理不当且效率低下。

在 libev 中处理 write_callback 事件的最佳方法是什么?

提前致谢。

最佳答案

很简单,还有 ev_io_stop,所以除非您有任何要写入的内容,否则您所做的是不启动写入观察程序,并且在回调中,当您写入整个缓冲区时调用 ev_io_stop。

在您很少溢出写入缓冲区的常见情况下(因为您的数据很小并且您不会经常写入),您可以通过尝试直接写入数据来提高效率(如果观察者未激活) ) 并且仅在无法完全写入数据时才缓冲数据并启动写入观察程序。

在上述假设下,这意味着您几乎不需要启动写观察器。缺点是代码复杂得多,因此在许多情况下,最好从简单的“将数据附加到写入缓冲区,启动观察器,如果缓冲区已完全写入,则在观察器内部停止它”逻辑开始。

关于c - Libev - I/O 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9451884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com