libhv/libhv API完全指南:从基础函数到高级应用
引言:为什么选择libhv?
在网络编程领域,开发者常常面临选择合适网络库的难题。libevent、libuv、asio等库虽然功能强大,但学习曲线陡峭,API设计复杂。而libhv作为一款新兴的网络库,以其简洁易用的API设计和丰富的功能集,正在迅速获得开发者的青睐。
本文将带领您全面探索libhv的API,从基础函数到高级应用,帮助您快速掌握这个强大网络库的使用技巧。无论您是网络编程新手还是有经验的开发者,阅读本文后,您将能够:
- 理解libhv的核心架构和设计理念
- 熟练使用libhv的基础API进行网络编程
- 掌握TCP/UDP/HTTP/WebSocket等协议的实现
- 开发高性能的客户端和服务器应用
- 解决实际项目中可能遇到的技术难题
1. libhv项目结构与核心模块
libhv的项目结构清晰,模块化设计使得各功能组件既相互独立又协同工作。以下是libhv的主要目录结构及其功能说明:
libhv/
├── base/ # 基础功能模块
├── event/ # 事件循环核心
├── http/ # HTTP协议实现
├── examples/ # 示例代码
├── evpp/ # C++封装接口
├── cpputil/ # C++工具类
├── ssl/ # SSL/TLS支持
├── mqtt/ # MQTT协议实现
├── protocol/ # 其他协议支持
└── docs/ # 官方文档
1.1 核心模块概述
libhv的核心功能由以下几个关键模块组成:
- 基础模块(base):提供内存管理、字符串操作、线程同步等基础功能
- 事件循环(event):实现跨平台的IO多路复用,是libhv的核心
- 网络接口(net):封装TCP/UDP socket操作
- HTTP模块(http):实现HTTP客户端和服务器
- WebSocket模块:支持WebSocket协议
- SSL模块:提供安全传输层支持
下面是libhv核心模块的依赖关系图:
graph TD
A[基础模块(base)] --> B[事件循环(event)]
B --> C[网络接口(net)]
C --> D[HTTP模块(http)]
C --> E[WebSocket模块]
C --> F[MQTT模块]
D --> E
C --> G[SSL模块]
2. 基础API详解
2.1 基础数据类型与工具函数
libhv提供了一系列基础数据类型和工具函数,位于base/目录下。这些函数为整个库提供了基础支持。
2.1.1 常用数据类型
libhv定义了一些跨平台的数据类型,确保在不同系统上的一致性:
// 来自[base/hdef.h](https://gitcode.com/libhv/libhv/blob/e2ba81baa2fd782a13ce4b2be7c181d8966442d4/base/hdef.h?utm_source=gitcode_repo_files)
typedef signed char int8_t;
typedef unsigned char uint8_t;
typedef short int16_t;
typedef unsigned short uint16_t;
typedef int int32_t;
typedef unsigned int uint32_t;
typedef long long int64_t;
typedef unsigned long long uint64_t;
typedef int64_t htime_t; // 时间戳类型
typedef uint64_t hthread_t; // 线程ID类型
typedef void* hv_handle_t; // 句柄类型
2.1.2 内存管理
libhv提供了一套内存管理函数,位于base/hbase.h:
// 内存分配
void* hmalloc(size_t size);
void* hcalloc(size_t nmemb, size_t size);
void* hrealloc(void* ptr, size_t size);
void hfree(void* ptr);
// 内存池操作
hmem_pool_t* hmem_pool_create(size_t block_size, int pre_alloc);
void* hmem_pool_alloc(hmem_pool_t* pool, size_t size);
void hmem_pool_free(hmem_pool_t* pool, void* ptr);
void hmem_pool_destroy(hmem_pool_t* pool);
2.1.3 字符串操作
libhv提供了丰富的字符串操作函数,定义在cpputil/hstring.h:
// 字符串格式化
std::string format(const char* fmt, ...);
// 字符串分割
std::vector<std::string> split(const std::string& str, const std::string& delim);
// 字符串转换
int to_int(const std::string& str);
float to_float(const std::string& str);
double to_double(const std::string& str);
std::string to_string(int value);
std::string to_string(double value);
// URL编码/解码
std::string url_encode(const std::string& str);
std::string url_decode(const std::string& str);
2.2 事件循环(Event Loop)
事件循环是libhv的核心,位于event/目录。它实现了跨平台的IO多路复用,支持epoll、kqueue、iocp等多种IO模型。
2.2.1 事件循环的创建与运行
// 来自[event/hloop.h](https://gitcode.com/libhv/libhv/blob/e2ba81baa2fd782a13ce4b2be7c181d8966442d4/event/hloop.h?utm_source=gitcode_repo_files)
hloop_t* hloop_new(int mode);
void hloop_run(hloop_t* loop, int run_mode);
void hloop_free(hloop_t* loop);
使用示例:
#include "hloop.h"
int main() {
// 创建事件循环实例
hloop_t* loop = hloop_new(0);
// 运行事件循环
hloop_run(loop, HLOOP_RUN_DEFAULT);
// 释放资源
hloop_free(loop);
return 0;
}
2.2.2 定时器功能
事件循环支持定时器功能,可以用来执行定时任务:
// 来自[event/hloop.h](https://gitcode.com/libhv/libhv/blob/e2ba81baa2fd782a13ce4b2be7c181d8966442d4/event/hloop.h?utm_source=gitcode_repo_files)
htimer_t* hloop_add_timer(hloop_t* loop, htimer_cb cb, uint32_t ms, int repeat);
int hloop_del_timer(hloop_t* loop, htimer_t* timer);
使用示例:
void on_timer(htimer_t* timer) {
static int count = 0;
printf("timer callback %d\n", count++);
if (count >= 5) {
hloop_del_timer(timer->loop, timer);
}
}
int main() {
hloop_t* loop = hloop_new(0);
// 添加定时器,每隔1秒执行一次,重复5次
hloop_add_timer(loop, on_timer, 1000, 1);
hloop_run(loop, HLOOP_RUN_DEFAULT);
hloop_free(loop);
return 0;
}
3. 网络编程基础
3.1 TCP编程
libhv提供了简洁易用的TCP编程接口,支持客户端和服务器模式。
3.1.1 TCP服务器
创建TCP服务器的基本步骤:
- 创建事件循环
- 创建TCP服务器
- 设置连接回调函数
- 启动服务器
// 来自[examples/tcp_echo_server.c](https://gitcode.com/libhv/libhv/blob/e2ba81baa2fd782a13ce4b2be7c181d8966442d4/examples/tcp_echo_server.c?utm_source=gitcode_repo_files)
#include "hloop.h"
#include "hsocket.h"
void on_close(hio_t* io) {
printf("connection closed\n");
}
void on_recv(hio_t* io, void* buf, int readbytes) {
// 回显数据
hio_write(io, buf, readbytes);
}
void on_accept(hio_t* io) {
printf("new connection: %s:%d\n", hio_remote_ip(io), hio_remote_port(io));
// 设置接收回调
hio_setcb_read(io, on_recv);
// 设置关闭回调
hio_setcb_close(io, on_close);
// 开始读取数据
hio_read(io);
}
int main() {
hloop_t* loop = hloop_new(0);
// 创建TCP服务器,监听8080端口
hio_t* listen_io = hloop_create_tcp_server(loop, "0.0.0.0", 8080, on_accept);
if (listen_io == NULL) {
return -1;
}
printf("tcp echo server listen on 0.0.0.0:8080\n");
hloop_run(loop, HLOOP_RUN_DEFAULT);
hloop_free(loop);
return 0;
}
3.1.2 TCP客户端
TCP客户端的使用同样简单:
// 来自[examples/tcp_client_test.c](https://gitcode.com/libhv/libhv/blob/e2ba81baa2fd782a13ce4b2be7c181d8966442d4/examples/tcp_client_test.c?utm_source=gitcode_repo_files)
#include "hloop.h"
#include "hsocket.h"
void on_close(hio_t* io) {
printf("connection closed\n");
}
void on_recv(hio_t* io, void* buf, int readbytes) {
printf("recv: %.*s\n", readbytes, (char*)buf);
}
void on_connect(hio_t* io, int err) {
if (err != 0) {
printf("connect error: %d\n", err);
return;
}
printf("connect success\n");
hio_setcb_read(io, on_recv);
hio_setcb_close(io, on_close);
hio_read(io);
// 发送数据
const char* msg = "hello, libhv!";
hio_write(io, msg, strlen(msg));
}
int main() {
hloop_t* loop = hloop_new(0);
// 连接到服务器
hloop_create_tcp_client(loop, "127.0.0.1", 8080, on_connect);
hloop_run(loop, HLOOP_RUN_DEFAULT);
hloop_free(loop);
return 0;
}
3.2 UDP编程
除了TCP,libhv也提供了UDP协议的支持。
// 来自[examples/udp_echo_server.c](https://gitcode.com/libhv/libhv/blob/e2ba81baa2fd782a13ce4b2be7c181d8966442d4/examples/udp_echo_server.c?utm_source=gitcode_repo_files)
#include "hloop.h"
#include "hsocket.h"
void on_udp_recv(hio_t* io, void* buf, int readbytes, struct sockaddr* peeraddr, socklen_t peerlen) {
// 回显数据
hio_udp_sendto(io, buf, readbytes, peeraddr, peerlen);
}
int main() {
hloop_t* loop = hloop_new(0);
// 创建UDP服务器
hio_t* io = hloop_create_udp_server(loop, "0.0.0.0", 8080, on_udp_recv);
if (io == NULL) {
return -1;
}
printf("udp echo server listen on 0.0.0.0:8080\n");
hloop_run(loop, HLOOP_RUN_DEFAULT);
hloop_free(loop);
return 0;
}
4. HTTP编程
HTTP是libhv的核心功能之一,提供了完整的HTTP客户端和服务器实现。
4.1 HTTP服务器
libhv的HTTP服务器API设计简洁而强大,支持路由、中间件、静态文件服务等功能。
4.1.1 基本HTTP服务器
// 来自[examples/http_server_test.cpp](https://gitcode.com/libhv/libhv/blob/e2ba81baa2fd782a13ce4b2be7c181d8966442d4/examples/http_server_test.cpp?utm_source=gitcode_repo_files)
#include "HttpServer.h"
using namespace hv;
int main(int argc, char** argv) {
int port = 8080;
if (argc > 1) {
port = atoi(argv[1]);
}
HttpService router;
// 静态文件服务
router.Static("/", "./html");
// API路由
router.GET("/ping", [](const HttpContextPtr& ctx) {
return ctx->send("pong");
});
router.GET("/get", [](const HttpContextPtr& ctx) {
Json resp;
resp["origin"] = ctx->ip();
resp["url"] = ctx->url();
resp["args"] = ctx->params();
resp["headers"] = ctx->headers();
return ctx->send(resp.dump(2));
});
router.POST("/echo", [](const HttpContextPtr& ctx) {
return ctx->send(ctx->body(), ctx->type());
});
// 路径参数
router.GET("/user/{id}", [](const HttpContextPtr& ctx) {
Json resp;
resp["id"] = ctx->param("id");
return ctx->send(resp.dump(2));
});
// 启用CORS
router.AllowCORS();
HttpServer server;
server.service = &router;
server.port = port;
// 启动服务器
server.start();
printf("HTTP server running on http://0.0.0.0:%d\n", port);
printf("Press Enter to stop...\n");
getchar();
return 0;
}
4.1.2 路由系统
libhv的HTTP服务器提供了灵活的路由系统,支持多种路由匹配方式:
// 精确匹配
router.GET("/", handler);
// 参数路由
router.GET("/user/{id}", user_handler);
// 通配符路由
router.GET("/static/*", static_handler);
// 正则路由
router.GET("/article/(\\d+)", article_handler);
// 任意HTTP方法
router.ANY("/api/*", api_handler);
4.1.3 中间件
中间件是处理HTTP请求的拦截器,可以在请求到达处理器之前或之后执行一些操作:
// 日志中间件
router.Use([](const HttpContextPtr& ctx) {
auto start = hv::steady_clock::now();
// 调用下一个中间件或处理器
ctx->next(start {
auto end = hv::steady_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
printf("[%s] %s %s %d %lldus\n",
ctx->ip().c_str(),
ctx->methodString(),
ctx->url().c_str(),
ctx->response()->status_code,
(long long)duration.count());
});
});
4.2 HTTP客户端
libhv提供了功能完善的HTTP客户端,支持同步和异步请求。
4.2.1 同步请求
// 来自[examples/http_client_test.cpp](https://gitcode.com/libhv/libhv/blob/e2ba81baa2fd782a13ce4b2be7c181d8966442d4/examples/http_client_test.cpp?utm_source=gitcode_repo_files)
#include "HttpClient.h"
int main() {
HttpClient cli;
// 发送GET请求
HttpRequest req;
req.url = "http://httpbin.org/get";
HttpResponse resp;
int ret = cli.send(&req, &resp);
if (ret != 0) {
printf("request failed: %d\n", ret);
return -1;
}
printf("status: %d\n", resp.status_code);
printf("headers:\n%s\n", resp.headers.dump().c_str());
printf("body:\n%s\n", resp.body.c_str());
return 0;
}
4.2.2 异步请求
异步请求不会阻塞当前线程,适合高性能场景:
// 来自[examples/http_client_test.cpp](https://gitcode.com/libhv/libhv/blob/e2ba81baa2fd782a13ce4b2be7c181d8966442d4/examples/http_client_test.cpp?utm_source=gitcode_repo_files)
void test_http_async_client(HttpClient* cli) {
auto req = std::make_shared<HttpRequest>();
req->method = HTTP_POST;
req->url = "http://127.0.0.1:8080/echo";
req->headers["Connection"] = "keep-alive";
req->body = "This is an async request.";
req->timeout = 10;
cli->sendAsync(req, [](const HttpResponsePtr& resp) {
if (resp == NULL) {
printf("request failed!\n");
} else {
printf("%d %s\n", resp->status_code, resp->status_message());
printf("%s\n", resp->body.c_str());
}
});
}
4.2.3 便捷HTTP请求函数
libhv还提供了类似Python requests库的便捷API:
// 来自[http/client/requests.h](https://gitcode.com/libhv/libhv/blob/e2ba81baa2fd782a13ce4b2be7c181d8966442d4/http/client/requests.h?utm_source=gitcode_repo_files)
// GET请求
HttpResponsePtr requests::get(const std::string& url, const http_headers& headers = {});
// POST请求
HttpResponsePtr requests::post(const std::string& url, const std::string& body = "", const http_headers& headers = {});
// 下载文件
size_t requests::downloadFile(const std::string& url, const std::string& filename);
// 上传文件
HttpResponsePtr requests::uploadFile(const std::string& url, const std::string& filename, const std::string& formname = "file");
使用示例:
// 来自[examples/http_client_test.cpp](https://gitcode.com/libhv/libhv/blob/e2ba81baa2fd782a13ce4b2be7c181d8966442d4/examples/http_client_test.cpp?utm_source=gitcode_repo_files)
#include "requests.h"
void test_requests() {
// GET请求
auto resp = requests::get("http://httpbin.org/get");
if (resp) {
printf("GET: %d %s\n", resp->status_code, resp->body.c_str());
}
// POST JSON数据
Json j;
j["name"] = "libhv";
j["version"] = "1.0.0";
http_headers headers;
headers["Content-Type"] = "application/json";
resp = requests::post("http://httpbin.org/post", j.dump(), headers);
if (resp) {
printf("POST: %d %s\n", resp->status_code, resp->body.c_str());
}
// 下载文件
size_t filesize = requests::downloadFile("http://httpbin.org/image/png", "image.png");
if (filesize > 0) {
printf("Downloaded %zu bytes\n", filesize);
}
}
5. WebSocket编程
WebSocket是一种在单个TCP连接上进行全双工通信的协议,libhv提供了完整的WebSocket支持。
5.1 WebSocket服务器
// 来自[examples/websocket_server_test.cpp](https://gitcode.com/libhv/libhv/blob/e2ba81baa2fd782a13ce4b2be7c181d8966442d4/examples/websocket_server_test.cpp?utm_source=gitcode_repo_files)
#include "WebSocketServer.h"
using namespace hv;
int main(int argc, char** argv) {
int port = 9999;
if (argc > 1) {
port = atoi(argv[1]);
}
HttpService http;
http.GET("/ping", [](const HttpContextPtr& ctx) {
return ctx->send("pong");
});
WebSocketService ws;
ws.onopen = [](const WebSocketChannelPtr& channel, const HttpRequestPtr& req) {
printf("onopen: GET %s\n", req->Path().c_str());
// 发送欢迎消息
channel->send("Welcome to libhv websocket server!");
};
ws.onmessage = [](const WebSocketChannelPtr& channel, const std::string& msg) {
printf("onmessage: %s\n", msg.c_str());
// 回显消息
channel->send(msg);
};
ws.onclose = [](const WebSocketChannelPtr& channel) {
printf("onclose\n");
};
WebSocketServer server;
server.port = port;
server.registerHttpService(&http);
server.registerWebSocketService(&ws);
server.start();
printf("WebSocket server running on ws://0.0.0.0:%d\n", port);
printf("Press Enter to stop...\n");
getchar();
return 0;
}
5.2 WebSocket客户端
// 来自[examples/websocket_client_test.cpp](https://gitcode.com/libhv/libhv/blob/e2ba81baa2fd782a13ce4b2be7c181d8966442d4/examples/websocket_client_test.cpp?utm_source=gitcode_repo_files)
#include "WebSocketClient.h"
using namespace hv;
class MyWebSocketClient : public WebSocketClient {
public:
MyWebSocketClient(EventLoopPtr loop = NULL) : WebSocketClient(loop) {}
int connect(const char* url) {
onopen = []() {
printf("onopen\n");
};
onmessage = this {
printf("onmessage: %s\n", msg.c_str());
};
onclose = []() {
printf("onclose\n");
};
// 设置重连策略
reconn_setting_t reconn;
reconn_setting_init(&reconn);
reconn.min_delay = 1000;
reconn.max_delay = 10000;
reconn.delay_policy = 2;
setReconnect(&reconn);
return WebSocketClient::open(url);
}
};
int main(int argc, char** argv) {
if (argc < 2) {
printf("Usage: %s url\n", argv[0]);
return -1;
}
const char* url = argv[1];
MyWebSocketClient ws;
ws.connect(url);
std::string input;
while (std::getline(std::cin, input)) {
if (input == "exit") break;
ws.send(input);
}
return 0;
}
6. 高级应用
6.1 多线程与线程池
libhv提供了线程池和异步任务执行功能,可以轻松实现并行处理。
// 来自[cpputil/hthreadpool.h](https://gitcode.com/libhv/libhv/blob/e2ba81baa2fd782a13ce4b2be7c181d8966442d4/cpputil/hthreadpool.h?utm_source=gitcode_repo_files)
#include "hthreadpool.h"
int main() {
// 创建线程池,4个工作线程
ThreadPool pool(4);
// 提交任务
for (int i = 0; i < 8; ++i) {
pool.submit([i]() {
printf("task %d running in thread %ld\n", i, hv_gettid());
hv_delay(100);
});
}
// 等待所有任务完成
pool.join();
return 0;
}
6.2 SSL/TLS加密通信
libhv支持SSL/TLS加密通信,可用于HTTPS和WSS(WebSocket Secure)。
// 来自[examples/http_server_test.cpp](https://gitcode.com/libhv/libhv/blob/e2ba81baa2fd782a13ce4b2be7c181d8966442d4/examples/http_server_test.cpp?utm_source=gitcode_repo_files)
#if TEST_HTTPS
server.https_port = 8443;
hssl_ctx_opt_t param;
memset(¶m, 0, sizeof(param));
param.crt_file = "cert/server.crt";
param.key_file = "cert/server.key";
param.endpoint = HSSL_SERVER;
if (server.newSslCtx(¶m) != 0) {
fprintf(stderr, "new SSL_CTX failed!\n");
return -20;
}
#endif
6.3 配置文件解析
libhv提供了INI配置文件解析功能,可以方便地读取配置文件。
// 来自[cpputil/iniparser.h](https://gitcode.com/libhv/libhv/blob/e2ba81baa2fd782a13ce4b2be7c181d8966442d4/cpputil/iniparser.h?utm_source=gitcode_repo_files)
#include "iniparser.h"
int main() {
IniParser ini;
ini.load("config.ini");
// 读取配置
int port = ini.getInt("server", "port", 8080);
std::string log_level = ini.getString("log", "level", "info");
bool daemon = ini.getBool("server", "daemon", false);
printf("port: %d\n", port);
printf("log_level: %s\n", log_level.c_str());
printf("daemon: %s\n", daemon ? "true" : "false");
return 0;
}
7. 性能优化与最佳实践
7.1 事件循环配置
合理配置事件循环可以显著提高性能:
// 设置事件循环线程数
server.setThreadNum(4);
// 设置IO线程数
server.setIOThreadNum(2);
// 设置工作线程数(处理业务逻辑)
server.setWorkerThreadNum(4);
7.2 连接管理
对于高并发服务器,合理的连接管理策略至关重要:
// 设置最大连接数
server.setMaxConnections(100000);
// 设置连接超时
server.setIdleTimeout(60); // 60秒
// 设置TCP keepalive
server.setTCPKeepAlive(true);
7.3 内存管理
libhv提供了内存池功能,可以减少内存分配开销:
// 使用内存池分配内存
hmem_pool_t* pool = hmem_pool_create(4096, 1024); // 4KB块,预分配1024个
void* buf = hmem_pool_alloc(pool, 1024);
// 使用buf...
hmem_pool_free(pool, buf);
hmem_pool_destroy(pool);
8. 实际应用案例
8.1 反向代理服务器
libhv可以轻松实现一个简单的反向代理服务器:
// 来自[examples/tinyproxyd.c](https://gitcode.com/libhv/libhv/blob/e2ba81baa2fd782a13ce4b2be7c181d8966442d4/examples/tinyproxyd.c?utm_source=gitcode_repo_files)
#include "hloop.h"
#include "hsocket.h"
#define BUF_SIZE 8192
typedef struct {
hio_t* client;
hio_t* server;
} proxy_t;
void server_on_close(hio_t* io) {
proxy_t* proxy = (proxy_t*)hio_get_userdata(io);
if (proxy->client) {
hio_close(proxy->client);
}
free(proxy);
}
void client_on_close(hio_t* io) {
proxy_t* proxy = (proxy_t*)hio_get_userdata(io);
if (proxy->server) {
hio_close(proxy->server);
}
free(proxy);
}
void server_on_recv(hio_t* io, void* buf, int readbytes) {
proxy_t* proxy = (proxy_t*)hio_get_userdata(io);
hio_write(proxy->client, buf, readbytes);
}
void client_on_recv(hio_t* io, void* buf, int readbytes) {
proxy_t* proxy = (proxy_t*)hio_get_userdata(io);
hio_write(proxy->server, buf, readbytes);
}
void on_connect(hio_t* server_io, int err) {
if (err != 0) {
printf("connect error: %d\n", err);
return;
}
proxy_t* proxy = (proxy_t*)hio_get_userdata(server_io);
proxy->server = server_io;
hio_setcb_read(server_io, server_on_recv);
hio_setcb_close(server_io, server_on_close);
hio_read(server_io);
}
void on_accept(hio_t* client_io) {
char* host = "127.0.0.1";
int port = 8080;
proxy_t* proxy = (proxy_t*)malloc(sizeof(proxy_t));
memset(proxy, 0, sizeof(proxy_t));
proxy->client = client_io;
hio_set_userdata(client_io, proxy);
hio_setcb_read(client_io, client_on_recv);
hio_setcb_close(client_io, client_on_close);
hio_read(client_io);
hloop_t* loop = hio_loop(client_io);
hio_t* server_io = hloop_create_tcp_client(loop, host, port, on_connect);
hio_set_userdata(server_io, proxy);
}
int main() {
hloop_t* loop = hloop_new(0);
hio_t* listen_io = hloop_create_tcp_server(loop, "0.0.0.0", 80, on_accept);
if (listen_io == NULL) {
return -1;
}
printf("tinyproxyd listen on 0.0.0.0:80, forward to %s:%d\n", "127.0.0.1", 8080);
hloop_run(loop, HLOOP_RUN_DEFAULT);
hloop_free(loop);
return 0;
}
8.2 WebSocket聊天服务器
使用libhv可以快速实现一个WebSocket聊天服务器:
// 简化版聊天服务器
#include "WebSocketServer.h"
#include <set>
using namespace hv;
std::set<WebSocketChannelPtr> clients;
std::mutex clients_mutex;
int main() {
WebSocketService ws;
ws.onopen = [](const WebSocketChannelPtr& channel) {
std::lock_guard<std::mutex> lock(clients_mutex);
clients.insert(channel);
printf("new client, total: %zu\n", clients.size());
};
ws.onmessage = [](const WebSocketChannelPtr& channel, const std::string& msg) {
std::lock_guard<std::mutex> lock(clients_mutex);
// 广播消息
for (auto it = clients.begin(); it != clients.end();) {
auto cli = *it;
if (cli->isConnected()) {
cli->send(msg);
++it;
} else {
it = clients.erase(it);
}
}
};
ws.onclose = [](const WebSocketChannelPtr& channel) {
std::lock_guard<std::mutex> lock(clients_mutex);
clients.erase(channel);
printf("client left, total: %zu\n", clients.size());
};
WebSocketServer server;
server.port = 9999;
server.registerWebSocketService(&ws);
server.start();
printf("Chat server running on ws://0.0.0.0:9999\n");
getchar();
return 0;
}
9. 总结与展望
9.1 核心功能回顾
libhv作为一款高性能网络库,提供了丰富的API和功能:
- 跨平台的事件循环实现
- 简洁易用的TCP/UDP API
- 完整的HTTP客户端/服务器实现
- WebSocket协议支持
- SSL/TLS加密通信
- 线程池和异步任务处理
- 配置文件解析
9.2 学习资源与社区支持
- 官方文档:docs/
- 示例代码:examples/
- GitHub仓库:https://gitcode.com/libhv/libhv
- API参考:docs/API.md
9.3 未来发展方向
libhv团队持续改进和扩展库的功能,未来可能包括:
- gRPC协议支持
- HTTP/3支持
- 更多协议实现
- 性能优化和新特性
附录:常用API速查表
事件循环API
| 函数名 | 描述 |
|---|---|
hloop_new() |
创建事件循环实例 |
hloop_run() |
运行事件循环 |
hloop_free() |
释放事件循环资源 |
hloop_add_timer() |
添加定时器 |
hloop_del_timer() |
删除定时器 |
HTTP服务器API
| 函数名 | 描述 |
|---|---|
HttpServer::start() |
启动HTTP服务器 |
HttpService::GET() |
注册GET路由 |
HttpService::POST() |
注册POST路由 |
HttpService::Static() |
设置静态文件服务 |
HttpService::Proxy() |
设置反向代理 |
HTTP客户端API
| 函数名 | 描述 |
|---|---|
HttpClient::send() |
发送同步HTTP请求 |
HttpClient::sendAsync() |
发送异步HTTP请求 |
requests::get() |
便捷GET请求 |
requests::post() |
便捷POST请求 |
requests::downloadFile() |
下载文件 |
WebSocket API
| 函数名 | 描述 |
|---|---|
WebSocketServer::registerWebSocketService() |
注册WebSocket服务 |
WebSocketChannel::send() |
发送WebSocket消息 |
WebSocketClient::open() |
连接WebSocket服务器 |
WebSocketClient::send() |
发送客户端消息 |
通过本文的介绍,相信您已经对libhv的API有了全面的了解。libhv以其简洁的设计和强大的功能,为网络编程提供了高效的解决方案。无论是开发简单的网络工具还是构建高性能的服务器应用,libhv都是一个值得考虑的选择。
希望本文能够帮助您更好地理解和使用libhv,在实际项目中发挥其优势。祝您编程愉快!
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00