libuv的调用例子

devtools/2024/11/8 18:00:53/

(来自文心一言)

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 官方文档 了解更多。


http://www.ppmy.cn/devtools/132367.html

相关文章

Python Numpy中的广播的含义(Numpy Broadcasting)

Numpy数组之间进行运算时&#xff0c;通常是逐元素之间进行运算&#xff0c;这通常要求数组具有相同的形状。而“广播&#xff08;Broadcasting&#xff09;”机制降低了这个限制&#xff0c;只需要满足一定的条件&#xff0c;形状不同的数组也可以进行运算&#xff0c;小数组会…

软件测试—功能测试详解

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、测试项目启动与研读需求文档 &#xff08;一&#xff09; 组建测试团队 1、测试团队中的角色 2、测试团队的基本责任 尽早地发现软件程序、系统或产…

求解优化问题算法探讨与分析

一、分枝定界法&#xff1a;强大的优化求解工具 &#xff08;一&#xff09;起源与发展 分枝定界法由查理德・卡普在 20 世纪 60 年代发明&#xff0c;当时成功求解了含有 65 个城市的旅行商问题&#xff0c;创下了记录。此后&#xff0c;该方法被广泛应用于整数规划问题、生…

Oceanbase学习之一迁移mysql数据到oceanbase

一、数据库环境 #mysql环境 root192.168.150.162 20:28: [(none)]> select version(); ---------- | version() | ---------- | 8.0.26 | ---------- 1 row in set (0.00 sec) root192.168.150.162 20:28: [(none)]> show variables like ‘%char%’; ---…

Django中ListView 和 DetailView类的区别

在Django中&#xff0c;ListView 和 DetailView都是基于类的视图&#xff0c;在处理请求时通常会自动调用render_to_response函数&#xff0c;但由于项目需求不同&#xff0c;实现时需要重写render_to_response函数 ListView 和 DetailView介绍 ListView 介绍主要用于展示一个…

GEE| 对Landsat 8 影像进行主成分分析

对 Landsat 8 影像进行主成分分析并实现可视化 // 定义感兴趣区域 var roi ee.FeatureCollection(users/yongweicao11/Dongguan2022);// 加载 Landsat 8 图像集合&#xff0c;并根据 ROI 和日期范围进行过滤 var imageL8 ee.ImageCollection("LANDSAT/LC08/C02/T1_TOA…

大数据数据存储层MemSQL, HBase与HDFS

以下是对 MemSQL、HBase 和 HDFS 的详细介绍,这些工具在分布式数据存储和处理领域有着重要作用。 1. MemSQL MemSQL(现称为 SingleStore)是一种分布式内存数据库,兼具事务处理(OLTP)和分析处理(OLAP)的能力,专为高性能实时数据处理设计。 1.1 核心特点 内存优先存储…

【MongoDB】MongoDB的Java API及Spring集成(Spring Data)

文章目录 Java APISpring 集成1. 添加依赖2. 配置 MongoDB3. 创建实体类4. 创建 Repository 接口5. 创建 Service 类6. 创建 Controller 类7. 启动 Spring Boot 应用8. 测试你的 API 更多相关内容可查看 Java API maven <dependency><groupId>org.mongodb</gr…