libfv:基于C++20的异步HTTP库


Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /www/wwwroot/fawdlstty.com/wp-content/plugins/wp-syntax/wp-syntax.php on line 383

仓库地址:https://github.com/fawdlstty/libfv

介绍一款船新HTTP库。C++的HTTP库很多,但基于C++20的异步网络HTTP库几乎没有。我没找到好用的,因此写了一个。在讲解这个库之前,我先说说为什么我们需要这样的库。

C++ HTTP库有两种主要的实现方式,第一种是同步HTTP网络访问,比如这样的代码:

1
2
3
// 伪代码
Response _r = HttpGet ("https://t.cn");
std::cout << _t.text;

这样的代码写起来很简单,但它存在一个问题:HTTP网络访问比较耗时,可能需要几百毫秒,这么长时间,这个线程将阻塞在这里,比较消耗线程资源。假如遇到需要同时发起几十、几百个请求,将较大消耗系统资源。很显然,它不是一个较好的设计。

继续阅读libfv:基于C++20的异步HTTP库

状态机是什么?有什么用?

推荐一个状态机库,支持C++与C#,通过两种语言分别实现。链接:https://github.com/fawdlstty/SMLite

为了大家都能看懂,下面的代码以C#做示例,C++可以在项目里找到具体示例代码及用法。

回到最初的标题问题,我们来假设一下,假如碰到了一个需求,需求是实现一个半双工的网络处理程序,所谓半双工也就是上传时不能下载,下载时不能上传,另外也不能两块数据同时上传或下载。

看起来很简单是吧,一个线程专门做上传或下载操作。但如何让外部知道网络线程的状态呢?一个合适的方案是,定义一个枚举状态,有四种枚举值,Rest、Ready、Reading、Writing,分别代表搁置状态、待命状态、正在读取、正在写入。然后就是,外部的事件,比如打开、关闭、写入等命令,如何传达到线程呢?这儿可以定义触发器枚举值,Run、Close、Read、FinishRead、Write、FinishWrite六种,其中外部触发四种,内部触发两种(完成读取与完成写入,线程自己最先知道)。下面我们来分析分析状态与触发器的关系:

继续阅读状态机是什么?有什么用?

使你的ASP.Net Core项目支持git

你有时候是否想过,自己开发一套类似Gitea的项目?或者是自己项目加入Git服务端功能,来做一些自动化文件同步之类的操作?现在你有了一个选择,GitServerCore。

地址:https://github.com/fawdlstty/GitServerCore

GitServerCore是一个.NET Core开发的服务端中间件,可以非常便捷的在你的项目中加入git服务端功能,然后就能在远程电脑上随心所欲的git clone、git push。基于这个功能,你能轻松实现:

  • 一个基于.Net Core的Gitea或GitLab
  • 自动化文件同步
  • 自动化CI/CD插件
继续阅读使你的ASP.Net Core项目支持git

计算机语言总结

为了方便执行各种各样不同的任务,描述不同的数据,先后诞生了成千上万种计算机语言。每种计算机语言都有自己的特点,分类方式有多种,按照不同的分类方式,语言的类型也不同。下面按照最常用的方式对语言分类进行大致介绍。其实这种分类方式并不完全准确,数据和代码并没有明显分界线,所以我就按照使用习惯对它们进行分类。

1、数据描述语言
数据描述语言分为基础数据描述语言以及文本标记语言,它们的界限也并不十分明确。

1.1、基础数据描述语言主要有:regex、css、xml、json、xaml
regex是正则表达式语法,几乎所有的通用编程语言都能使用正则表达式,但让人意外的是不同语言的regex语法不完全一样,有些有细微区别,需要仔细鉴别。另外正则表达式对于数字处理上较弱,另外语法教复杂,对于新手来说非常不友好。
css是样式标记语言的老大,主要存在于网页或视频中,网页文字或图像的样式、电影字幕通常都使用css进行描述,它的儿子们有qss(css的qt移植版)、less(语法比css先进,编译为css后通用)、sass(与less差不多)等等。
xml、json是使用最广泛的基础数据描述语言,可以描述几乎所有的数据类型,它俩语法结构上比较相似,但几乎不成对出现。xml年代较古老,所以基于它的语法变种更多;从语法上讲json更先进,能以更少的空间描述相同的数据量。它俩都有schema,用于保证格式准确。
xaml是xml的一个变种,主要用于描述.NET系列程序界面(WinForm除外的窗口程序)。描述界面的语言特乱,一个框架就是一种界面描述语言,比如.NET、安卓等,所以跨框架迁移是一件非常麻烦的事。
继续阅读计算机语言总结

加密介绍


加密通讯总共有四大类,签名算法、对称加密算法、非对称加密算法与量子加密技术,下面分别对几大类算法进行介绍

1、签名算法

代表算法:md5、sha1、crc32
有的地方叫签名算法,有的地方叫哈希算法,有的地方叫指纹算法、数字摘要等等,都代表一个意思。在解释这个之前我先说说“哈希”的意思。哈希也叫散列,意思是,将一串任意长度数据经过某种特定的算法转为固定长度的输出。比如10000个字符将其转为20个字符,这样的算法就叫哈希算法。20个字符虽然容易重复,但随着字符的增多,重复概率将会指数级下降,但通过20个字符很容易就能确定10000个字符的范围,比如对N组10000个字符进行对比,这样做的好处是通过比对20个字符的签名就能筛选出绝大部分数据,剩下的数据经过简单的比对就行了,非常省时省力。
签名算法有什么优势呢?
(1)、校验数据准确性。数据的准确性在通信领域有着举足轻重的作用。纠错编码比如海明码等等可以使错误编码在一定范围内时对其进行纠正,但一旦超过阈值,就算使用编码纠错,最终得出的结果也是错误的。这时候就需要哈希算法对数据进行签名,以确保数据准确性。
(2)、对数据进行归纳整理。比如哈希表就基于哈希算法,将一堆数据均匀分布在哈希结构中,使得寻找某个数据非常简单方便。
(3)、做验证之用。比如用户登录界面,在客户端经过哈希算法计算之后,服务器端只需要验证结果是不是符合就可以了,不用传输整个密码。就算黑客在中途截获数据包也无法推算出密码(暂时不考虑彩虹表等玩意儿,哈希算法可以定义为信息不可逆)。
优势挺多,但劣势也比较严重:
(1)、数据不可逆。也就是说,生成的签名几乎不可能再推导回原数据。
(2)、相对来说不那么安全。彩虹表有一定概率可以在短时间破解MD5加密的密码,王小云研究出来的哈希碰撞也能在一定程度上削弱MD5的安全性。
继续阅读加密介绍