libevent 和非阻塞套接字

发布于 2024-11-13 06:36:15 字数 239 浏览 1 评论 0原文

据我了解,为了使用 libevent 监视套接字,应首先使用正确的参数调用 event_set()

libevent 文档指出 event_set() 的 event 参数可以是 EV_READ 或 EV_WRITE。该事件参数是需要注意的事件。

但是 EV_READ 和 EV_WRITE 对应什么套接字事件呢?我的意思是,与监视传入消息相比,我将如何监视连接状态的变化?

I understand that in order to monitor a socket using libevent, event_set() should first be called with the correct parameters.

The libevent documentation states that the event parameter to event_set() can be either EV_READ or EV_WRITE. And that this event parameter is the event to look out for.

But what socket events do EV_READ and EV_WRITE correspond to? I mean how would I monitor for a change in connection status, versus monitor for an incoming message?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

溺深海 2024-11-20 06:36:15

我发现这个网站在文档方面非常出色libevent。在处理事件的页面上,有一个关于不同事件的很好的概述事件标志的实际含义。从该链接:

  • EV_READ:此标志表示事件在以下情况下变为活动状态:
    提供的文件描述符已准备好读取。

  • EV_WRITE:此标志表示事件已激活
    当提供的文件描述符准备好写入时。

  • EV_SIGNAL:用于实现信号检测。

  • EV_PERSIST:表示事件是持久的。

  • EV_ET:表示事件应为边沿触发,如果
    底层 event_base 后端支持边缘触发事件。
    这会影响 EV_READ 和 EV_WRITE 的语义。

因此,明确回答您的问题: EV_READ 对应于可以从套接字或 bufferevent 读取数据,据我所知,它们是 libevent 套接字的等效项。 EV_WRITE 对应于套接字/缓冲区事件已准备好将数据写入其中。 的 cb 参数设置读/写回调来实际执行数据读取和写入

您可以使用
结构事件 *event_new(结构 event_base *base, evutil_socket_t fd,
简而言之,event_callback_fn cb, void *arg);

如果您使用 libevent 进行套接字 IO,那么您可能真的需要考虑使用 缓冲事件 - 它们是我在我的一个项目中使用的,snot_mon,您可以在 github 上查看

I've found this site to be excellent in terms of documentation for libevent. On the page dealing with events, there's a nice overview of what different event flags actually mean. From that link:

  • EV_READ : This flag indicates an event that becomes active when
    the provided file descriptor is ready for reading.

  • EV_WRITE : This flag indicates an event that becomes active
    when the provided file descriptor is ready for writing.

  • EV_SIGNAL : Used to implement signal detection.

  • EV_PERSIST : Indicates that the event is persistent.

  • EV_ET : Indicates that the event should be edge-triggered, if
    the underlying event_base backend supports edge-triggered events.
    This affects the semantics of EV_READ and EV_WRITE.

So to answer your question explicitly: EV_READ corresponds to having data available to be read from the socket or bufferevent, which are the libevent socket equivalents as far as I can tell. EV_WRITE corresponds to the socket/bufferevent being ready to have data written to it. You can set read / write callbacks to actually do the data reading and writing with the cb argument to


struct event *event_new(struct event_base *base, evutil_socket_t fd,
short what, event_callback_fn cb, void *arg);

If you're doing socket IO with libevent, though, you may really want to consider using buffer events - they're what I use in one of my projects, snot_mon, which you can check out over on github.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文