libevent监听域套接字,怎样设置非阻塞没有调用read_cb
时间: 2024-10-16 07:03:15 浏览: 58
Libevent是一个高性能的事件库,它支持多种类型的I/O,包括域套接字(Domain sockets)。在libevent中,如果你想要设置一个非阻塞模式并监听域套接字,通常你会创建一个`ev_loop`结构,并在其上关联一个`EV_PERSIST`标志的`ev_io`事件。对于域套接字,你需要使用`ev_socket_new_domain`函数创建一个socket。
以下是设置非阻塞模式并避免直接调用`read_cb`的基本步骤:
1. 初始化libevent库:
```c
#include <event2/event.h>
struct event_base *base = event_base_new();
```
2. 创建非阻塞域套接字:
```c
int domain_sock = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK);
if (domain_sock == -1) {
// 处理错误
}
// 将socket绑定到特定路径
struct sockaddr_un addr;
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path, "your_socket_name");
bind(domain_sock, (struct sockaddr *)&addr, sizeof(addr));
```
3. 创建`ev_io`事件:
```c
struct ev_io *watcher = ev_io_new(base, domain_sock, EV_READ);
watcher->data = NULL; // 设置自定义数据
watcher->events |= EV_READ | EV_PERSIST; // 非阻塞并持久化监听
```
4. 注册事件处理:
```c
int r = event_add(watcher, NULL); // 添加到事件循环
if (r != 0) {
// 处理错误
}
```
5. 当有连接到来时,libevent会在`watcher`对应的回调函数中自动触发,这个默认的回调通常是`evp_read`。如果你想自定义读取操作,你可以通过设置`read_cb`成员函数,但在实际操作中,这一步通常是不需要的,因为`evp_read`会自动处理读取操作。
注意:虽然上面提到没有直接调用`read_cb`,但实际上当发生事件时,`evp_read`会被调用,除非你覆盖了它的行为并提供自己的事件处理器。
阅读全文