- 博客(113)
- 资源 (1)
- 收藏
- 关注
原创 workflow系列教程(6)实现静态资源服务器
我们不占用任何线程读取文件,而是产生一个异步的读文件任务,在读取完成之后回复请求。再次说明一下,我们需要把完整回复数据读取到内存,才开始回复消息。所以不适合用来传输太大的文件。
2024-03-04 14:46:06
1963
原创 WFrest 库:快速、高效的基于workflow的C++异步 Web 框架
WFrest 库是一个简单易用、高效的 C++异步 Web 框架,它能够帮助开发者快速搭建高性能的 HTTP 服务器。如果你正在寻找一个 C++的 Web 框架,那么 WFrest 库绝对值得一试。
2023-12-19 19:36:08
2408
原创 workflow系列教程(5-2)实现HTTP反向代理
这是一个http代理服务器,可以配置在浏览器里使用。支持所有的http method。因为https代理的原理不同,这个示例并不支持https代理,你只能浏览http网站。这个proxy在实现上需要抓取下来完整的http页面再转发,下载/上传大文件会有延迟。
2023-12-19 11:10:29
2325
原创 workflow系列教程(5-1)HTTP Server
这是一个http server,返回一个html页面,显示浏览器发送的http请求的header信息。程序log里会打印出请求的client地址,请求序号(当前连接上的第几次请求)。当同一连接上完成10次请求,server主动关闭连接。程序通过Ctrl-C正常结束,一切资源完全回收。
2023-12-18 19:32:45
2167
原创 探秘:Spdlog - 高速、灵活的 C++日志库
Spdlog是一个开源的、快速的、仅有头文件的C++11日志库。它提供了向流、标准输出、文件、系统日志、调试器等目标输出日志的能力,支持的平台包括Windows、Linux、Mac、Android。
2023-12-18 19:31:15
2910
原创 Socket全连接、半连接队列与Listen函数的Backlog参数深度解析
当涉及到网络编程和Socket通信时,理解全连接队列和半连接队列是至关重要的。它们是操作系统中用于管理传入连接请求的两个关键概念,而listen()函数中的backlog参数则直接涉及到这两个队列的调节和管理。
2023-12-17 19:48:04
2081
原创 workflow系列教程(4)Parallel并联任务流
上一篇博客中讲了串行任务流,有了串行,那必然也有并行,本篇博客讲解任务流并行执行。
2023-12-17 19:46:54
1883
1
原创 深入了解惊群问题:Accept、Epoll及Nginx的优化策略
惊群现象是在多进程/多线程并发编程中出现的一种性能问题。它通常发生在多个进程或线程等待某个事件的时候,当这个事件发生时,所有等待的进程或线程都被唤醒,即使只有一个进程或线程实际上需要处理这个事件。这种情况导致了额外的资源竞争、消耗和性能下降。
2023-12-16 19:13:53
2497
原创 深入探究Linux守护进程:释放你的代码力量!
你的代码不只是运行在终端背后,它可以在Linux系统中默默发挥巨大作用。本文将带你探索Linux守护进程的神奇世界。从创建到管理,学会利用守护进程将任务高效地放置在后台,释放你代码的力量,让你的应用焕发更强大的活力。迈出这一步,让你的代码在系统中轻盈而自信地运行,享受守护进程带来的无限可能性!
2023-12-16 19:12:36
1657
原创 C++异步网络库workflow系列教程(3)Series串联任务流
首先,workflow是任务流的意思,在workflow中万物皆为任务流.任务流分为以下两种1.就像链表一样,前面的任务执行完了后执行后面的2.可以理解为开了多个线程,并发执行任务。
2023-12-15 17:32:54
2637
原创 精准定时任务管理:探究Linux下timerfd与epoll的默契
Linux 提供了强大的工具,timerfd 和 epoll,它们的结合为高效的定时任务处理提供了机会。本文深入探讨了 timerfd 的创建和配置,以及如何通过 epoll 实现异步处理定时器事件。从网络编程到性能监控,timerfd 和 epoll 的联合应用为实时系统和多任务调度带来新的可能性。探索这个默契组合,优化你的Linux编程体验!
2023-12-15 16:08:39
2471
原创 C++异步网络库workflow系列教程(2)redis任务
与http task的get_req()类似,redis task的get_req()返回任务对应的redis request。RedisRequest提供的功能可以在查看。 其中,set_request接口用于设置redis命令。
2023-12-14 18:28:56
2535
原创 掌握文件控制:深入解析 Linux fcntl 函数
在Linux系统中,文件控制是开发者必备的技能之一。这篇博客将带你深入探索Linux中强大的文件控制函数fcntl,从基础到高级应用,解析其各种参数、用法及示例。了解如何通过fcntl函数实现对文件的灵活管理,从修改文件属性到实现文件锁定,助你在文件操作中游刃有余。
2023-12-14 18:25:26
2406
1
原创 C++异步网络库workflow入门教程(1)HTTP任务
创建任务方法原型在workflow中所有的客户端任务都放在`WFTaskFactory`工厂类中+ `url:`请求的http url+ `redirect_max:`表示最大重定向次数。如果在请求过程中遇到重定向,该参数指定了最多允许重定向的次数。+ `retry_max`:表示最大重试次数。如果请求失败,该参数指定了最多可以重试的次数。+ `callback`:这是一个回调函数的指针,用于处理请求的响应。原型为`using http_callback_t = std::function
2023-12-13 17:38:09
1710
2
原创 Linux获取文件信息的利器stat,fstat,lstat,fstatat
stat系列函数是C语言中的一个系统调用函数,用于获取文件的信息。通过提供文件路径,它能够返回包含文件属性的结构体数据。
2023-12-13 17:30:09
2608
原创 workFlow c++异步网络库编译教程与简介
搜狗公司C++服务器引擎,编程范式。支撑搜狗几乎所有后端C++在线服务,包括所有搜索服务,云输入法,在线广告等,每日处理数百亿请求。这是一个设计轻盈优雅的企业级程序引擎,可以满足大多数后端与嵌入式开发需求。编程范式结构化并发与任务隐藏回调与内存回收机制
2023-12-12 20:10:59
1996
原创 GO闭包实现原理(汇编级讲解)
函数闭包一点也不神秘,它就是函数和引用环境而组合的实体。在Go中,闭包在底层是一个结构体对象,它包含了函数指针与自由变量。Go编译器的逃逸分析机制,会将闭包对象分配至堆中,这样自由变量就不会随着函数栈的销毁而消失,它能依附着闭包实体而一直存在。因此,闭包使用的优缺点是很明显的:闭包能够避免使用全局变量,转而维持自由变量长期存储在内存之中;但是,这种隐式地持有自由变量,在使用不当时,会很容易造成内存浪费与泄露。附着闭包实体而一直存在。
2023-12-12 20:08:15
2164
原创 Linux 零拷贝splice函数
splice是 Linux 系统中用于在两个文件描述符之间移动数据的系统调用。它的主要作用是在两个文件描述符之间传输数据,而无需在用户空间进行数据拷贝。也是零拷贝操作.
2023-11-19 22:57:18
2215
原创 Linux 零拷贝sendfile函数
sendfile函数允许在两个文件描述符之间直接传输数据,而无需将数据从内核空间复制到用户空间再发送。它在 Linux 系统上首次出现于 2.2 内核版本。效率很高,这被称为零拷贝。out_fd是输出文件描述符,通常是网络套接字描述符。in_fd是输入文件描述符,通常是打开的文件或套接字。offset是一个指向 off_t 类型的指针,用于指定从输入文件的哪个位置开始传输数据。如果为NULL,则从当前文件偏移量开始传输。count是要传输的字节数。
2023-11-19 22:55:11
1912
原创 muduo源码剖析之TcpServer服务端
TcpServer拥有Acceptor类,新连接到达时new TcpConnection后续客户端和TcpConnection类交互。TcpServer管理连接和启动线程池,用Acceptor接受连接。服务端封装 - muduo的server端维护了多个tcpconnection注意TcpServer本身不带Channel,而是使用Acceptor的Channel。
2023-11-17 08:48:22
1803
原创 muduo源码剖析之TcpConnection连接管理
TcpCon用于管理一个具体的 TCP 连接,比如消息的接收与发送,完成用户指定的连接回调 connectionCallback。TcpConnection 构造时接收参数有 TCP 连接的 sockfd,服务端地址 localAddr,客户端地址 peerAddr,并通过 Socket 封装 sockfd。并用 Channel 管理该 sockfd,向 Channel 注册可读、可写、关闭、出错回调函数,用于 Poller 返回就绪事件后 Channel::handleEvent() 执行相应事件的回调。
2023-11-17 08:44:04
1618
原创 QT自定义信号,信号emit,信号参数注册
使用signals声明返回值是void在需要发送信号的地方使用emit 信号名字(参数)进行发送在需要链接的地方使用connect进行链接ct进行链接。
2023-11-16 20:00:45
1805
原创 Qt3个窗口类的区别
一个普通的窗口,不包含菜单栏、状态栏,除了登录界面,新建项目时建议使用QWidget,因为大部分的窗口可能都要做成无边框窗口,需要自定义标题栏,实现拉伸等;QMainWindow使用的场景不多。:对话框,常用来做登录窗口、弹出窗口(例如设置界面):包含菜单栏、工具栏、状态栏。
2023-11-12 20:30:33
1422
原创 三分钟学完Git版本控制常用指令
Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:
2023-11-12 20:17:38
1779
2
原创 muduo源码剖析之Connector客户端连接类
Connector负责主动发起连接,不负责创建socket,只负责连接的建立,外部调用Connector::start就可以发起连接,Connector具有重连的功能和停止连接的功能,连接成功建立后返回到TcpClient。
2023-11-09 21:08:52
1760
原创 muduo源码剖析之TcpClient客户端类
muduo用TcpClient发起连接,TcpClient有一个Connector连接器,TCPClient使用Conneccor发起连接, 连接建立成功后, 用socket创建TcpConnection来管理连接, 每个TcpClient class只管理一个TcpConnecction,连接建立成功后设置相应的回调函数。很显然,TcpClient用来管理客户端连接,真正连接交给Connector。
2023-11-09 21:06:46
2489
原创 加密算法小结
加密算法解密小结MD5 提取结果通常是 32 位,不受明文长度影响;Base64 编码结果末尾通常会出现一或二个等于符号,受明文长度影响;一长串无规律数字与字母组合的字符大概率是 AES、DES、SHA 相关加密;SHA1 加密结果值为 40 位,不受明文长度影响;SHA256 加密结果值为 64 位,不受明文长度影响;另外,AES、RSA 等对称和非对称加密都喜欢将结果值用 Base64 进行编码,这样易于传递;如果你看到一长串字符里出现 + 号、\ 号和末尾的 = 号,那大概率就是上一行描
2023-11-08 21:59:21
1865
原创 muduo源码剖析之TimerQueue类
通过timerfd实现的定时器功能,为EventLoop扩展了一系列runAt,runEvery,runEvery等函数TimerQueue中通过std::set维护所有的Timer,也可以使用优先队列实现muduo的TimerQueue是基于timerfd_create实现,这样超时很容易和epoll结合起来。等待超时事件保存在set集合中,注意set集合的有序性,从小到大排列,整个对TimerQueue的处理也就是对set集合的操作。
2023-11-08 21:56:42
1532
原创 muduo源码剖析之Timer定时器
Timer 类是 muduo 网络库中的一个定时器类,用于在指定的时间间隔后执行某个任务。Timer 类提供了一系列的方法来创建、启动、停止和删除定时器,以及设置定时器的时间间隔和回调函数等。在 muduo 网络库中,Timer 类被广泛应用于各种网络任务中,例如定期发送心跳包、更新缓存、清理资源等。通过使用 Timer 类,我们可以方便地实现定时任务,提高网络应用程序的可靠性和稳定性。:启动定时器,在指定的时间间隔后调用回调函数。:停止定时器,不再执行定时任务。
2023-11-07 22:39:21
1660
原创 muduo源码剖析之InetAddress
InetAddress 类在 muduo 网络库中被广泛使用,用于表示网络中的通信实体的地址信息,例如服务器地址、客户端地址等。通过 InetAddress 类,我们可以方便地操作 IP 地址和端口号,实现网络通信的功能。InetAddress 类是 muduo 网络库中的一个重要类,用于表示网络中的 IP 地址和端口号。源码比较简单,已经编写详细注释。
2023-11-07 22:38:09
1656
原创 muduo源码剖析之Acceptor监听类
Acceptor类用于创建套接字,设置套接字选项,调用socket()->bind()->listen()->accept()函数,接受连接,然后调用TcpServer设置的connect事件的回调。listen()//在TcpServer::start中调用封装了一个listen fd相关的操作,用于mainLoop接受器封装,实质上就是对Channel的多一层封装监听连接当新连接进入时,调用Socket::accept创建套接字,触发TcpServer的回调TcpServer通过该接口设置回调,当新连
2023-10-29 22:05:44
2318
原创 Linux文件描述符和文件指针互转
文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。FILE *指针变量标识符;其中FILE应为大写,它实际上是由系统定义的一个结构,该结构中含有文件名、文件状态和文件当前位置等信息。在编写源程序时不必关心FILE结构的细节。
2023-10-29 21:57:45
1622
原创 C++单元测试GoogleTest和GoogleMock十分钟快速上手(gtest&gmock)
gtest是Google开源的一个跨平台的(Liunx、Mac OS X、Windows等)的 C++ 单元测试框架,可以帮助程序员测试 C++ 程序的结果预期。它提供了丰富的断言、致命和非致命判断、参数化、”死亡测试”等等。另一方面,gmock并不是一个独立的测试框架,而是gtest的辅助框架,主要用于模拟没有实现的类的操作,以便在没有完整类的情况下进行测试。通过配合使用gtest和gmock,开发者可以编写出更为复杂且健壮的C++单元测试。
2023-10-28 19:42:18
3121
原创 muduo源码剖析之Buffer缓冲区类
Buffer封装了一个可变长的buffer,支持廉价的前插操作,以及内部挪腾操作避免额外申请空间使用vector作为缓冲区(可自动调整扩容)
2023-10-28 19:37:25
1569
原创 muduo源码剖析之poller/EpollPoller多路复用类
poller是I/O多路复用接口抽象虚基类,对I/O多路复用API的封装,muduo提供了EPollPoller和PollPoller派生类(epoll和poll),所以不支持select.newDefaultPoller()默认选择epoll。
2023-10-26 20:02:12
1657
原创 Linux文件描述符和打开文件之间的关系
文件描述符和打开的文件之间似乎呈现出一一对应的关系。然而,实际并非如此。多个文件描述符指向同一打开文件,这既有可能,也属必要。这些文件描述符可在相同或不同的进程中打开。要理解具体情况如何,需要查看由内核维护的 3 个数据结构。进程级的文件描述符表。系统级的打开文件表。文件系统的 i-node 表。上述讨论揭示出如下要点。两个不同的文件描述符,若指向同一打开文件句柄,将共享同一文件偏移量。
2023-10-26 19:59:15
1831
原创 Linux创建临时文件mkstemp()tmpfile()
有些程序需要创建一些临时文件,仅供其在运行期间使用,程序终止后即行删除。很多编译器程序会在编译过程中创建临时文件。GNU C 语言函数库为此而提供了一系列库函数。(之所以有“一系列”的库函数,部分原因是由于这些函数分别继承自各种 UNIX 实现。)本节将介绍其中的两个函数:mkstemp()和 tmpfile()。
2023-10-25 18:19:30
358
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅