2025-07-31 14:47:51 +08:00
|
|
|
|
# NetraLib
|
|
|
|
|
c/c++基本开发库
|
|
|
|
|
|
|
|
|
|
# TCP 服务端操作
|
|
|
|
|
包括多线程客户端连接,指定客户端数据的收发等等功能
|
2025-08-04 15:46:52 +08:00
|
|
|
|
|
|
|
|
|
# Linux 中屏蔽所有信号操作
|
|
|
|
|
屏蔽所有信号,以防止意外退出
|
2025-08-11 11:17:32 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 写文件操作
|
|
|
|
|
允许原文本进行覆盖写,追加写
|
|
|
|
|
允许二进制进行覆盖写,追加写
|
2025-08-16 10:35:26 +08:00
|
|
|
|
允许在特定位置后面进行插入覆盖操作
|
|
|
|
|
允许删除特定字段后面所有内容在进行写操作
|
|
|
|
|
可以根据需要计算特定符号最后一个字节或者第一个字节所在位置所在位置
|
2025-08-11 11:17:32 +08:00
|
|
|
|
|
|
|
|
|
所有操作都添加mutex锁机制 ,保障线程安全
|
2025-08-11 11:40:28 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 读文件操作
|
|
|
|
|
支持全文读取(文本和二进制模式)
|
|
|
|
|
支持按行读取文本内容
|
|
|
|
|
支持按指定字节数读取数据
|
|
|
|
|
支持计算第一个指定字节序列结束位置(包含该序列本身)的字节数
|
|
|
|
|
提供文件是否存在和文件大小查询
|
|
|
|
|
支持重置文件读取位置,实现多次读取
|
|
|
|
|
|
2025-08-11 11:41:37 +08:00
|
|
|
|
所有操作都添加mutex锁机制 ,保障线程安全
|
2025-08-11 11:40:28 +08:00
|
|
|
|
|
|
|
|
|
|
2025-08-15 12:41:16 +08:00
|
|
|
|
# 字符串操作
|
|
|
|
|
支持左右空格删除
|
|
|
|
|
支持格式化输出
|
|
|
|
|
|
|
|
|
|
|
2025-09-08 12:51:00 +08:00
|
|
|
|
# Http请求
|
|
|
|
|
提供基于 `cpp-httplib` 的简易 HTTP 客户端封装 `NetRequest`,支持:
|
|
|
|
|
1. 同步/异步 GET、POST(JSON、表单)
|
|
|
|
|
2. 连接/读写超时设置、Keep-Alive
|
|
|
|
|
3. 并发请求上限控制
|
|
|
|
|
4. 可选内存缓存(GET 命中时不发起网络请求)
|
|
|
|
|
5. 简单日志回调与性能统计
|
|
|
|
|
6. 断点续传下载到本地文件
|
|
|
|
|
|
|
|
|
|
使用步骤:
|
|
|
|
|
|
|
|
|
|
1) 引入头文件,配置目标地址
|
|
|
|
|
```cpp
|
|
|
|
|
#include "NetRequest.hpp"
|
|
|
|
|
|
|
|
|
|
ntq::RequestOptions opt;
|
|
|
|
|
opt.scheme = "http"; // 或 https
|
|
|
|
|
opt.host = "127.0.0.1"; // 服务器地址
|
|
|
|
|
opt.port = 8080; // 端口(https 一般 443)
|
|
|
|
|
opt.base_path = "/api"; // 可选统一前缀
|
|
|
|
|
opt.connect_timeout_ms = 3000;
|
|
|
|
|
opt.read_timeout_ms = 8000;
|
|
|
|
|
opt.write_timeout_ms = 8000;
|
|
|
|
|
opt.default_headers = { {"Authorization", "Bearer TOKEN"} }; // 可选
|
|
|
|
|
|
|
|
|
|
ntq::NetRequest req(opt);
|
|
|
|
|
req.setMaxConcurrentRequests(4);
|
|
|
|
|
req.enableCache(std::chrono::seconds(10));
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
2) 发送 GET 请求
|
|
|
|
|
```cpp
|
|
|
|
|
auto r = req.Get("/info");
|
|
|
|
|
if (r && r->status == 200) {
|
|
|
|
|
// r->body 为返回内容
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 带查询参数与额外请求头
|
|
|
|
|
httplib::Params q = {{"q","hello"},{"page","1"}};
|
|
|
|
|
httplib::Headers h = {{"X-Req-Id","123"}};
|
|
|
|
|
auto r2 = req.Get("/search", q, h);
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
3) 发送 POST 请求
|
|
|
|
|
```cpp
|
|
|
|
|
// JSON(Content-Type: application/json)
|
|
|
|
|
std::string json = R"({"name":"orangepi","mode":"demo"})";
|
|
|
|
|
auto p1 = req.PostJson("/set", json);
|
|
|
|
|
|
|
|
|
|
// 表单(application/x-www-form-urlencoded)
|
|
|
|
|
httplib::Params form = {{"user","abc"},{"pwd","123"}};
|
|
|
|
|
auto p2 = req.PostForm("/login", form);
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
4) 异步调用
|
|
|
|
|
```cpp
|
|
|
|
|
auto fut = req.GetAsync("/info");
|
|
|
|
|
auto res = fut.get(); // 与同步用法一致
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
5) 下载到本地(支持断点续传)
|
|
|
|
|
```cpp
|
|
|
|
|
bool ok = req.DownloadToFile("/files/pkg.bin", "/tmp/pkg.bin", {}, /*resume*/true);
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
6) 统计信息
|
|
|
|
|
```cpp
|
|
|
|
|
auto s = req.getStats();
|
|
|
|
|
// s.total_requests / s.total_errors / s.last_latency_ms / s.avg_latency_ms
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
说明:
|
|
|
|
|
- 若使用 HTTPS,需在编译时添加 `-DCPPHTTPLIB_OPENSSL_SUPPORT` 并链接 `-lssl -lcrypto`,且将 `opt.scheme` 设为 `"https"`、端口通常为 `443`。
|
|
|
|
|
- `base_path` 与各函数传入的 `path` 会自动合并,例如 `base_path="/api"` 且 `Get("/info")` 实际请求路径为 `/api/info`。
|