libuv tcp使用
时间: 2025-01-02 14:38:32 浏览: 7
### 使用 libuv 进行 TCP 开发
#### 创建事件循环
为了使用 `libuv` 的功能,首先需要创建一个事件循环实例。这可以通过调用 `uv_loop_t *loop = uv_default_loop();` 来完成。
```c
#include <uv.h>
int main() {
uv_loop_t *loop = uv_default_loop();
}
```
#### 初始化TCP句柄
初始化一个新的 TCP 句柄用于监听传入连接或建立新的客户端连接:
```c
uv_tcp_t server;
uv_tcp_init(loop, &server);
```
#### 绑定地址并监听端口
设置服务器套接字选项,并绑定到指定 IP 地址和端口号上准备接收新连接请求[^1]。
```c
struct sockaddr_in addr;
uv_ip4_addr("0.0.0.0", 7000, &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;
}
```
#### 处理新连接
当有新的客户端尝试连接时会触发回调函数,在此定义处理逻辑来接受这些连接。
```c
void on_new_connection(uv_stream_t* server, int status) {
if (status < 0) {
fprintf(stderr, "New connection error %s\n", uv_strerror(status));
// Handle errors here.
return;
}
uv_tcp_t* client = (uv_tcp_t*) malloc(sizeof(uv_tcp_t));
uv_tcp_init(loop, client);
if (uv_accept(server, (uv_stream_t*)client) == 0)
uv_read_start((uv_stream_t*)client, alloc_buffer, echo_read);
else
free(client);
}
```
#### 数据读取与写入操作
实现数据传输过程中的读缓冲区分配以及实际的数据读取消息回显给发送方的功能。
```c
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 echo_read(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) {
if (nread < 0) {
if (nread != UV_EOF)
fprintf(stderr, "Read error %s\n", uv_err_name(nread));
uv_close((uv_handle_t*)tcp, NULL);
free(buf->base);
return;
}
printf("Received data: %.*s\n", (int)nread, buf->base);
uv_write_t* req = new uv_write_t;
uv_buf_t wrbuf = uv_buf_init(buf->base, nread);
uv_write(req, tcp, &wrbuf, 1, after_write);
}
void after_write(uv_write_t* req, int status) {
delete req;
}
```
通过上述代码片段展示了基于 `libuv` 库构建简单 TCP 服务端应用程序的方法,包括启动事件循环、配置网络接口参数、响应客户接入请求及双向通信等功能模块的设计思路[^2]。
阅读全文