(来自文心一言)
Libuv 是一个多平台的异步 I/O 库,旨在提供事件驱动的编程模型,类似于 Node.js 的底层机制。以下是一个简单的例子,展示了如何使用 libuv 来创建一个 TCP 服务器和客户端。
首先,确保你已经安装了 libuv。你可以从 libuv 的 GitHub 页面下载并安装它。
简单的 TCP 服务器
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <uv.h>
void alloc_buffer(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) {
buf->base = (char*) malloc(suggested_size);
buf->len = suggested_size;
}
void on_read(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf, const uv_stream_t* src) {
if (nread < 0) {
if (nread != UV_EOF)
fprintf(stderr, "Read error %s\n", uv_strerror((int)nread));
uv_close((uv_handle_t*) stream, NULL);
free(buf->base);
return;
}
if (nread == 0) {
free(buf->base);
return;
}
printf("Server received: %s\n", buf->base);
uv_buf_t write_buf = uv_buf_init("Hello from server", strlen("Hello from server"));
uv_write_t req;
uv_write(&req, stream, &write_buf, 1, NULL);
free(buf->base);
}
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 = (uv_tcp_t*) malloc(sizeof(uv_tcp_t));
uv_tcp_init(uv_default_loop(), client);
uv_accept(server, (uv_stream_t*) client);
uv_read_start((uv_stream_t*) client, alloc_buffer, on_read);
}
int main() {
uv_loop_t* loop = uv_default_loop();
uv_tcp_t server;
uv_tcp_init(loop, &server);
uv_ip4_addr("0.0.0.0", 7000, &server.addr);
uv_listen((uv_stream_t*)&server, 128, on_new_connection);
return uv_run(loop, UV_RUN_DEFAULT);
}
简单的 TCP 客户端
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <uv.h>
void alloc_buffer(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) {
buf->base = (char*) malloc(suggested_size);
buf->len = suggested_size;
}
void on_read(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf, const uv_stream_t* src) {
if (nread < 0) {
if (nread != UV_EOF)
fprintf(stderr, "Read error %s\n", uv_strerror((int)nread));
uv_close((uv_handle_t*) stream, NULL);
free(buf->base);
return;
}
if (nread == 0) {
free(buf->base);
return;
}
printf("Client received: %s\n", buf->base);
uv_close((uv_handle_t*) stream, NULL);
free(buf->base);
}
void on_connect(uv_connect_t* req, int status) {
if (status < 0) {
fprintf(stderr, "Connect error %s\n", uv_strerror(status));
return;
}
uv_buf_t write_buf = uv_buf_init("Hello from client", strlen("Hello from client"));
uv_write_t write_req;
uv_write(&write_req, req->handle, &write_buf, 1, NULL);
uv_read_start((uv_stream_t*) req->handle, alloc_buffer, on_read);
}
int main() {
uv_loop_t* loop = uv_default_loop();
uv_tcp_t socket;
uv_connect_t connect_req;
uv_tcp_init(loop, &socket);
struct sockaddr_in dest;
uv_ip4_addr("127.0.0.1", 7000, &dest);
uv_tcp_connect(&connect_req, &socket, (const struct sockaddr*)&dest, on_connect);
return uv_run(loop, UV_RUN_DEFAULT);
}
编译和运行
假设你已经安装了 libuv,并且源代码文件名为 server.c 和 client.c,你可以使用以下命令编译和运行它们:
sh
gcc -o server server.c -luv
gcc -o client client.c -luv
./server &
./client
首先启动服务器,然后启动客户端。客户端会发送一条消息到服务器,服务器会接收消息并回复客户端。
这个例子展示了如何使用 libuv 创建一个简单的 TCP 服务器和客户端,并进行基本的读写操作。libuv 提供了更多高级功能,比如文件 I/O、定时器、信号处理等,你可以参考 libuv 官方文档 了解更多。