libevent库 unix域通信客户端服务端示例
时间: 2024-10-16 13:04:54 浏览: 4
libevent是一个高性能、事件驱动的网络和I/O库,特别适合于实时系统和对性能敏感的应用程序。它支持TCP/IP、UDP、Unix Domain Socket等多种协议。下面是一个简单的Unix域服务器和客户端的libevent示例:
**服务器端示例(server.c):**
```c
#include <event2/event.h>
#include <sys/un.h>
void event_handler EV_READ(int fd, short flags, void *arg) {
char buf[1024];
int n = read(fd, buf, sizeof(buf));
if (n > 0) {
printf("Server received: %s\n", buf);
write(fd, "Hello from server!", strlen("Hello from server!"));
} else {
close(fd);
free(arg);
}
}
int main() {
struct sockaddr_un addr;
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, "/tmp/test.sock", sizeof(addr.sun_path));
int listener_fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
bind(listener_fd, (struct sockaddr *)&addr, sizeof(addr));
listen(listener_fd, 5);
evutil_socket_t server_fd = accept(listener_fd, NULL, NULL);
event_base* base = event_base_new();
EV_SET(server_fd, server_fd, EV_READ | EV_PERSIST, event_handler, NULL, base);
event_add(server_fd, NULL);
event_base_dispatch(base);
event_base_free(base);
return 0;
}
```
**客户端示例(client.c):**
```c
#include <event2/event.h>
#include <sys/un.h>
void event_handler EV_WRITE(int fd, short flags, void *arg) {
char msg[] = "Hello from client!";
write(fd, msg, strlen(msg));
}
int main() {
struct sockaddr_un addr;
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, "/tmp/test.sock", sizeof(addr.sun_path));
int conn_fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
connect(conn_fd, (struct sockaddr *)&addr, sizeof(addr));
event_base* base = event_base_new();
EV_SET(conn_fd, conn_fd, EV_WRITE, event_handler, NULL, base);
event_add(conn_fd, NULL);
event_base_dispatch(base);
event_base_free(base);
return 0;
}
```
在这个例子中,服务器创建了一个Unix域套接字,并监听连接请求。当有客户端连接时,`event_handler`会被触发,处理读写的操作。客户端则尝试连接到这个套接字并发送消息。
阅读全文