【问题标题】:libevent and non-blocking socketslibevent 和非阻塞套接字
【发布时间】:2011-06-04 22:34:51
【问题描述】:

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

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

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

【问题讨论】:

  • IIRC:如果连接关闭,您将获得正常的读/写事件,当您尝试读/写时,您将获得零字节读/写。当你写的时候,你可能还会得到一个 SIGPIPE。这表明连接已被另一端关闭。

标签: c sockets libevent


【解决方案1】:

我发现this site 在 libevent 的文档方面非常出色。在the page dealing with events 上,可以很好地概述不同事件标志的实际含义。从那个链接:

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

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

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

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

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

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

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

但是,如果您使用 libevent 进行套接字 IO,您可能真的想考虑使用 buffer events - 它们是我在我的一个项目中使用的,snot_mon,which you can check out over on github

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    相关资源
    最近更新 更多