IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 使用 C++20 实现异步网络访问 -> 正文阅读

[C++知识库]使用 C++20 实现异步网络访问

libfv 介绍

libfv是一个极简异步HTTP库,支持tcp、HTTP1.1、websocket的客户端/服务器等功能,可以通过它轻易实现HTTP异步开发。如果你刚好喜欢C++20异步,那么libfv就是你的最佳选择

文档地址:https://libfv.fawdlstty.com/zh_hans/

注意:使用这个库之前,首先需要知道 co_await 关键字的作用

  • 推荐异步学习文档:使用 Async 和 Await 的异步编程,微软官方出品C#语言的异步教程,将async关键字省略,await关键字换成co_await,就和C++的几乎一样了
  • 推荐异步学习文档:stackless与await,如果想要深入了解co_await关键字的实现思路那么不可错过

废话不多说,教大家如何使用。首先安装:

vcpkg install fawdlstty-libfv

然后,就可以使用libfv啦。

同步转异步

libfv既然是异步HTTP库,那么使用网络功能首先需要在异步函数里调用。众所周知,main函数是同步函数,因此,我们需要在main函数里发起异步任务。我们此处同步方法转异步方法:

#include <fv/fv.h>

Task<void> async_func () {
	// 后面会写到异步功能的代码,将其粘贴到此处就可以啦
}

int main () {
	fv::Tasks::Init ();
	fv::Tasks::RunAsync (async_func);
	fv::Tasks::LoopRun ();
	fv::Tasks::Release ();
	return 0;
}

http client

libfv有个非常棒的特性是,内部维护连接池。只要schema(http或https)、域名、端口都相同,那么连接会自动复用。这特性将极大降低高频客户端的连接维护成本。

注:连接池在libfv 0.0.7版本开始支持。另外libfv的http客户端功能比此处介绍更强。详见文档

fv::Response _r1 = co_await fv::Get ("https://t.cn");
fv::Response _r2 = co_await fv::Post ("https://t.cn", fv::body_kv ("a", "1"), fv::body_kv ("b", "2"));

websocket client

接下来是websocket客户端。同样也非常简单。以下代码即实现websocket的发送,以及循环接收后续数据:

std::shared_ptr<fv::WsConn> _conn = co_await fv::ConnectWS ("wss://t.cn/ws");
co_await _conn->SendText ("hello", 5);
while (true) {
	auto [_data, _type] = co_await _conn->Recv ();
	std::cout << _data << std::endl;
}

http server

客户端基本使用介绍完毕。下面说说服务器端。我们来实现一个http服务器端,简单的返回hello world的功能:

fv::HttpServer _server {};
_server.SetHttpHandler ("/hello", [] (fv::Request &_req) -> Task<fv::Response> {
	co_return fv::Response::FromText ("hello world");
});
co_await _server.Run (8080);

以上代码运行之后,浏览器里请求 http://127.0.0.1:8080/hello,即可看到效果。

websocket server

websocket服务器端其实就是http服务器端,只不过监听之后处理函数的处理步骤不同而已,区别就是,判断客户端是否为websocket连接,如果是,那么升级为websocket连接即可:

fv::HttpServer _server {};
_server.SetHttpHandler ("/ws", [] (fv::Request &_req) -> Task<fv::Response> {
	if (_req.IsWebsocket ()) {
		auto _conn = co_await _req.UpgradeWebsocket ();
		while (true) {
			auto [_data, _type] = co_await _conn->Recv ();
			if (_type == fv::WsType::Text) {
				co_await _conn->SendText (_data.data (), _data.size ());
			} else if (_type == fv::WsType::Binary) {
				co_await _conn->SendBinary (_data.data (), _data.size ());
			}
		}
		co_return fv::Response::Empty ();
	} else {
		co_return fv::Response::FromText ("please use websocket");
	}
});
co_await _server.Run (8080);

后续客户端通过 ws://127.0.0.1:8080/ws 即可实现连接websocket服务器。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-04 22:37:15  更:2022-07-04 22:39:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/12 5:24:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码