用libuv写一个简单的事件驱动的例子
时间: 2023-10-07 19:14:15 浏览: 51
好的,我可以给您提供一个简单的事件驱动的例子,使用 libuv 库来实现。
这个例子会创建一个 TCP 服务器,当有新的连接时,会打印出客户端的 IP 地址和端口号,并回复一个简单的消息。具体实现如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <uv.h>
// 连接处理函数
void on_new_connection(uv_stream_t *server, int status) {
if (status < 0) {
fprintf(stderr, "New connection error: %s\n", uv_strerror(status));
return;
}
// 初始化客户端连接
uv_tcp_t *client = malloc(sizeof(uv_tcp_t));
uv_tcp_init(uv_default_loop(), client);
// 接受客户端连接
if (uv_accept(server, (uv_stream_t*) client) == 0) {
// 获取客户端地址
struct sockaddr_storage addr;
int len = sizeof(addr);
uv_tcp_getpeername(client, (struct sockaddr*) &addr, &len);
char ip[17] = { 0 };
int port = -1;
if (addr.ss_family == AF_INET) {
struct sockaddr_in *s = (struct sockaddr_in*) &addr;
uv_inet_ntop(AF_INET, &s->sin_addr, ip, sizeof(ip));
port = ntohs(s->sin_port);
} else if (addr.ss_family == AF_INET6) {
struct sockaddr_in6 *s = (struct sockaddr_in6*) &addr;
uv_inet_ntop(AF_INET6, &s->sin6_addr, ip, sizeof(ip));
port = ntohs(s->sin6_port);
}
printf("New connection from %s:%d\n", ip, port);
// 回复消息
char* response = "Hello, World!\n";
uv_buf_t buf = uv_buf_init(response, strlen(response));
uv_write_t *req = malloc(sizeof(uv_write_t));
uv_write(req, (uv_stream_t*) client, &buf, 1, NULL);
} else {
uv_close((uv_handle_t*) client, NULL);
}
}
int main() {
uv_loop_t *loop = uv_default_loop();
// 创建 TCP 服务器
uv_tcp_t server;
uv_tcp_init(loop, &server);
// 绑定地址和端口号
struct sockaddr_in addr;
uv_ip4_addr("127.0.0.1", 12345, &addr);
uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0);
// 监听连接
int r = uv_listen((uv_stream_t*) &server, 128, on_new_connection);
if (r) {
fprintf(stderr, "Listen error: %s\n", uv_strerror(r));
return 1;
}
// 运行事件循环
uv_run(loop, UV_RUN_DEFAULT);
return 0;
}
```
在上面的代码中,我们首先创建了一个 TCP 服务器,并绑定了地址和端口号。然后,我们使用 `uv_listen` 函数开始监听连接,并将连接回调函数设置为 `on_new_connection`。当有新的连接时,`on_new_connection` 函数会被调用,我们在这个函数中接受连接,并获取客户端的 IP 地址和端口号,然后回复一个简单的消息。
最后,我们使用 `uv_run` 函数来运行 libuv 的事件循环。这个函数会一直阻塞,直到所有的事件都被处理完毕。
希望这个例子能够帮助您理解 libuv 的事件驱动模型。如果您有任何问题或疑问,请随时和我交流。