
开源代码学习
文章平均质量分 76
喜欢打篮球的普通人
这个作者很懒,什么都没留下…
展开
-
服务器并发编程--libevent
Libevent 是一个用C语言编写的、轻量级的开源高性能网络库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。Libevent 已经被广泛的应用,作为底层的网络库;原创 2024-05-05 17:21:37 · 1210 阅读 · 0 评论 -
C/C++/rust常用开源库总结
C++相关技术学习文档。原创 2024-04-25 10:04:11 · 3131 阅读 · 0 评论 -
muduo异步日志库
基本思想是准备2部分buffer:A和B,前端(front end)线程往buffer A填入数据(日志消息),后端(back end)线程负责将buffer B写入日志文件。实现时,在后端设置一个已满缓冲队列(Buffer1~n,2原创 2023-10-22 09:30:51 · 761 阅读 · 0 评论 -
muduo C++网络库的学习笔记
然后判断一个C++可执行文件是debug build还是release build?即判断:一个可执行文件是-O0编译的还是-O2编译的?inline在头文件中还是需要的,可以防止链接器重复定义(multipe definition);inline关键字在源文件中不是必须的,编译器可以自动判断;原创 2022-10-29 13:55:00 · 494 阅读 · 0 评论 -
617. 合并二叉树
文章目录1.题目2.代码1.题目题目要求eg:示例 1:输入: Tree 1 Tree 2 1 2 / \ / \ 3 2原创 2022-01-20 20:22:52 · 268 阅读 · 0 评论 -
C++相关开源项目
文章目录Tinyhttpd项目简介:Tinyhttpd 是J. David Blackstone在1999年写的一个不到 500 行的超轻量型 Http Server,用来学习非常不错,可以帮助我们真正理解服务器程序的本质。建议源码阅读顺序为:main->startup->accept_request->execute_cgi, 通晓主要工作流程后再仔细把每个函数的源码看一看。这500行代码吃透了,C语言的功底就会大幅提升。tmux项目简介: tmux一个炫酷的终端复用软原创 2021-11-11 10:17:29 · 3696 阅读 · 0 评论 -
(P48)muduo库使用例子(七):abcbank(muduo版本)
文章目录1.mysql配置2.windows底下额BankServer改为Linux用muduo库来实现1.mysql配置sudo apt-get install mysql-server mysql-clientsudo apt-get install libmysqlclient15-dev,mysql开发工具包启动命令:sudo /etc/init.d/mysql restart或者:sudo mysqld_safe -user=mysql &关闭:sudo mysqladmin原创 2021-07-11 15:56:01 · 269 阅读 · 0 评论 -
(P47)muduo库使用例子(六):限制服务器最大并发连接数,用Timing wheel踢掉空闲连接
文章目录1.限制服务器最大并发连接数2.用Timing wheel踢掉空闲连接1.限制服务器最大并发连接数MuduoManual.pdf P108eg测试:测试:回射服务器回射客户端,使用nc测试第一个连接第二个连接第三个连接2.用Timing wheel踢掉空闲连接MuduoManual.pdf P122如果是8s钟,那么该循环队列就有8个格子(8个桶bucket);这个循环队列只有1个尾指针tail;尾指针tail同样也需要注册一个1s钟的定时器原创 2021-07-10 10:17:22 · 273 阅读 · 0 评论 -
(P46)muduo库使用例子(五):测量两台机器网络延迟
文章目录1.测量两台机器网络延迟1.测量两台机器网络延迟RTT(MuduoManual.pdf P119),与NTP的工作原理类似(1)NTP是网络时间同步协议,用来同步客户端与服务端的时钟RTT=(T4-T1)-(T3-T2)T1+RTT/2=T2+offset(offse是指客户端与服务器端的时间差,若客户端的时钟快了,则offset为正。)所以offset=T1-T2+RTT/2=T1-T2+((T4-T1)-(T3-T2))/2=((T4+T1)-(T2+(T3)))/2(2)r原创 2021-07-10 08:14:51 · 292 阅读 · 0 评论 -
(P44-P45)muduo库使用例子(三):聊天服务器
文章目录1.聊天服务器2.消息格式3.时序图1.聊天服务器聊天服务器(MuduoManual.pdf P66)examples/asio/chat/server.cc 单线程examples/asio/chat/server_threaded.cc,多线程TcpServer,并用mutex来保护共享数据mutexexamples/asio/chat/server_threaded_efficient.cc,借shared_ptr实现copy-on-write的手法来降低锁竞争examples原创 2021-07-07 23:05:44 · 329 阅读 · 0 评论 -
(P43)muduo库使用例子(二):文件传输
文章目录1.文件传输1.文件传输文件传输(MuduoManual.pdf P57)eg:42\jmuduo\examples\filetransfer\download.cc42\jmuduo\examples\filetransfer\download2.ccexamples/filetransfer/download3.cceg测试:tests/Filetransfer_test.cc23:10...原创 2021-07-07 07:52:56 · 539 阅读 · 0 评论 -
(P48)muduo库使用例子(七):高效率多线程异步日志
文章目录1.多线程程序日志库要求1.多线程程序日志库要求线程安全,即多个线程可以并发写日志,两个线程的日志消息不会出现交织。(1)用一个全局的mutex保护IO(2)每个线程单独写一个日志文件前者造成全部线程抢占一个锁,会造成写日志变成了串行后者有可能让业务线程阻塞在写磁盘操作上,影响业务线程的并发能力解决办法:用一个背景线程(日志线程,后端线程)负责收集日志消息,并写入日志文件,其他业务线程(前端线程)只管往这个“日志线程”发送日志消息(不是实时的),这称为“异步日志”,并不原创 2021-07-03 11:51:59 · 449 阅读 · 0 评论 -
(P42)muduo库使用例子(一):五个简单TCP协议,muduo库网络模型使用示例
MuduoManual.pdf P50(1)echo - 回显服务,把收到的数据发回客户端eg测试:42\jmuduo\examples\simple\echo\echo.h42\jmuduo\examples\simple\echo\main.cc42\jmuduo\CMakeLists.txt测试:客户端使用nc服务端客户端退出后,服务端一个TcpConnection销毁了(2)discard - 服务器端收到客户端发送过来的数据,丢弃所有收到的数据;eg:42\jmuduo\exampl原创 2021-06-30 23:15:40 · 829 阅读 · 3 评论 -
(P41)muduo_inspect库源码分析:muduo_inspect库通过HTTP方式为服务器提供监控接口
文章目录1.muduo_inspect库通过HTTP方式为服务器提供监控接口1.muduo_inspect库通过HTTP方式为服务器提供监控接口接受了多少个TCP连接当前有多少个活动连接一共响应了多少次请求每次请求的平均响应时间多少毫秒。。。Inspector // 包含了一个HttpServer对象ProcessInspector // 通过ProcessInfo返回进程信息ProcessInfo // 获取进程相关信息,muduo_base库中已做了解原创 2021-06-29 23:15:52 · 295 阅读 · 1 评论 -
(P40)muduo_http库源码分析:http request,http response
文章目录1.http request2.http response3.一个典型的http请求4.一个典型的http应答5.muduo_http库涉及到的类1.http requestrequest line请求行 + header头部 + body (header分为普通报头,请求报头与实体报头)header与body之间有一空行(CRLF)请求方法有:Get, Post, Head, Put, Delete等协议版本1.0、1.1常用请求头(1)Accept:浏览器可接受的原创 2021-06-27 22:30:09 · 326 阅读 · 0 评论 -
(P39)muduo_base库源码分析:muduo库对编写tcp客户端程序的支持
文章目录1.muduo库对编写tcp客户端程序的支持1.muduo库对编写tcp客户端程序的支持Connector // 主动发起连接TcpClient // 包含了一个Connector对象测试程序Reactor_test11.cc // echo serverTcpClient_test.cc // echo client测试:只启动客户端,会进行自动重连启动服务器端客户端发送的数据又可以从服务器端回射回来了...原创 2021-06-27 12:50:40 · 240 阅读 · 0 评论 -
(P38)muduo_base库源码分析:完善TcpConnection,signal(SIGPIPE, SIG_IGN) ,可变类型解决方案
文章目录1.完善TcpConnection2.signal(SIGPIPE, SIG_IGN)3.可变类型解决方案4.boost::any1.完善TcpConnectionWriteCompleteCallback含义,可以理解为低水位标回调函数HighWaterMarkCallback含义,高水位标回调函数boost::any context_eg:38\jmuduo\muduo\net\TcpConnection.h38\jmuduo\muduo\net\TcpConnect原创 2021-06-26 11:43:59 · 245 阅读 · 0 评论 -
(P36-P37)muduo_base库源码分析:应用层缓冲区Buffer设计 ,epoll使用LT模式的原因,其他缓冲区设计方案 ,TcpConnection中增加send,shutdown
文章目录1.应用层缓冲区Buffer设计2.epoll使用LT模式的原因1.应用层缓冲区Buffer设计muduo的IO模型是IO复用,且fd是非阻塞模式,若使用阻塞模式,IO线程可能阻塞在read,write等系统调用,这样的话,其他fd的IO事件到来,IO线程也不能够及时处理,也就不能最大限度的使用IO线程为什么需要有应用层缓冲区(详见MuduoManual.pdf P76)(1)2.4.2 为什么 non-blocking 网络编程中应用层 buffer 是必须的?(2)2.4.3原创 2021-06-23 22:55:39 · 382 阅读 · 0 评论 -
(P35)muduo_base库源码分析:muduo库如何支持多线程,multiple reactors
文章目录1.muduo库如何支持多线程2.multiple reactors1.muduo库如何支持多线程muduo支持多线程的方式:一个程序有多个EventLoop,一个EventLoop属于一个线程,也就是所谓的one Loop per threadEventLoopThread(IO线程类)EventLoopThreadPool(IO线程池类)IO线程池的功能是开启若干个IO线程,并让这些IO线程处于事件循环的状态2.multiple reactors每个Reactor都属于一个原创 2021-06-23 07:32:32 · 310 阅读 · 1 评论 -
(P34)muduo_base库源码分析:TcpConnection生存期管理
连接关闭时序图(1)一个TcpServer维护了一个已连接列表,当一个连接关闭的时候,TcpConnection的通道处于活跃状态,EventLoop的事件循环返回这个通道,并且调用handleEvent来处理;连接关闭属于可读事件,这里回调了TcpConnection的handleRead(),handleRead()调用read()返回为0,判断返回为0,则又调用了handleClose(),handleClose()中又回调了TcpServer中的removeConnection(),erase将原创 2021-06-21 22:57:27 · 309 阅读 · 2 评论 -
(P33)muduo_base库源码分析:TcpServer/TcpConnection
文章目录1.TcpServer/TcpConnection1.TcpServer/TcpConnectionAcceptor类的主要功能是socket、bind、listen一般来说,在上层应用程序中,我们不直接使用Acceptor,而是把它作为TcpServer的成员,TcpServer就具有了Acceptor功能TcpServer还包含了一个TcpConnection列表因为TcpServer能够处理多个连接TcpConnection与Acceptor类似,有两个重要的数据成原创 2021-06-20 22:13:03 · 262 阅读 · 1 评论 -
(P32)muduo_base库源码分析:Acceptor
文章目录1.Acceptor1.AcceptorAcceptor用于accept(2)接受TCP连接Acceptor的数据成员包括Socket、Channel,Acceptor的socket是listening socket(即server socket)。该流程要十分熟练:(1)Channel用于观察此socket的readable事件,Channel就处于活跃的状态,Poller::poll就能返回活跃的该Channel通道,并且调用Channel::handleEvent()对事件进原创 2021-06-20 20:26:34 · 237 阅读 · 0 评论 -
(P31)muduo_base库源码分析:Socket封装
文章目录1.Socket封装1.Socket封装Endian.h封装了字节序转换函数(全局函数,位于muduo::net::sockets名称空间中)。SocketsOps.h/ SocketsOps.cc封装了socket相关系统调用(全局函数,位于muduo::net::sockets名称空间中)。Socket.h/Socket.cc(Socket类)用RAII方法封装socket file descriptorInetAddress.h/InetAddress.cc(I原创 2021-06-20 17:20:02 · 210 阅读 · 0 评论 -
(P30)muduo_base库源码分析:EventLoopThread
文章目录1.EventLoopThread1.EventLoopThread任何一个线程,只要创建并运行了EventLoop,都称之为IO线程IO线程不一定是主线程muduo并发模型one loop per thread + threadpool(1)一个程序有多个IO线程,这些IO线程可以使用IO线程池来管理。所以是IO线程池(主要处理IO事件,调用EventLoop.runInLoop()也可以执行计算任务)+计算线程池(计算任务)(2)IO线程池所对应的类是EventLoopT原创 2021-06-19 11:26:28 · 245 阅读 · 0 评论 -
(P29)muduo_base库源码分析:进程(线程)wait/notify
文章目录1.进程(线程)wait/notify1.进程(线程)wait/notify一个线程通知一个等待中的线程,方法有3个:方法1:pipe(1)fd[0]对应管道的读端,fd[1]对应管道的写端,fd[0]只能用于读,不能用于写,fd[1]只能用于写,不能用于读,这意味着管道是单向的;(2)等待线程等待fd[0]的可读事件,通知线程只要往fd[1]写入一个数据,fd[0]就变的可读了,等待线程就获得通知,就被唤醒了;方法2:socketpair(1)也有一对fd,任意一个fd都原创 2021-06-16 23:27:00 · 334 阅读 · 0 评论 -
(P28)muduo_base库源码分析:定时器,lower_bound&upper_bound,RVO
返回值优化(Return Value Optimization,简称RVO)是一种编译器优化机制。原创 2021-06-14 11:27:56 · 319 阅读 · 0 评论 -
(P26-P27)muduo_base库源码分析:muduo网络库的类图,定时器函数选择
文章目录1.muduo网络库的类图2.时序图1.muduo网络库的类图类图如下:解释如下:灰色是内部类,对外不可见;白色是外部类,对外可见;EventLoop类EventLoop是对事件循环的抽象;Poller类,PollPoller类,EPollPoller类(1)下面的三个是muduo唯一使用面向对象编程思想的地方,下面三个类都是内部类,Poller是抽象类,有三个纯虚函数,muduo的对外接口不使用虚函数来暴露的:Poller是对I/O复用的抽象;PollPol原创 2021-06-12 10:20:29 · 505 阅读 · 1 评论 -
(P25)muduo_base库源码分析:TCP网络编程最本质是的处理三个半事件,EchoServer类图,什么都不做的EventLoop
文章目录1.TCP网络编程最本质是的处理三个半事件2.EchoServer类图1.TCP网络编程最本质是的处理三个半事件连接建立:服务器accept(被动)接受连接,客户端connect(主动)发起连接连接断开:主动断开(close、shutdown),被动断开(read返回0,指对等端主动断开连接)消息到达:文件描述符可读消息发送完毕:这算半个。对于低流量的服务,可不必关心这个事件;这里的发送完毕是指数据写入操作系统缓冲区,将由TCP协议栈负责数据的发送与重传,不代表对方已经接收原创 2021-06-10 23:07:58 · 338 阅读 · 2 评论 -
(P23-P24)多线程与并发服务器设计
文章目录1.循环式/迭代式服务器2.1.循环式/迭代式服务器2.若采用多进程方式fork之后,父进程需要关闭已连接socket,子进程需要关闭监听socket若采用多线程的方式则不需要关闭什么socket容易发生“惊群”现象,客户端连接过来的时候,即多个子进程都处于accept状态,只有一个进程返回值是正确的,其他进程返回失败了。参考:大并发服务器的多线程与并发服务器设计: 常见并发服务器方案...原创 2021-06-08 23:20:50 · 417 阅读 · 0 评论 -
(P22)muduo_base库源码分析:日志滚动条件
文章目录1.日志滚动条件1.日志滚动条件以下的条件只要满足一个就会进行日志回滚文件大小(例如每写满1G换下一个文件)时间(每天零点新建一个日志文件,不论前一个文件是否写满)一个典型的日志文件名logfile_test.20130411-115604.popo.7743.logbasename含义测试:每次写满196K就换一个新文件0:36:47...原创 2021-06-07 23:17:42 · 265 阅读 · 0 评论 -
(P21)muduo_base库源码分析:日志类封装,StringPiece类
文章目录1.日志类封装1.日志类封装假设给缓冲区data_中添加2个字节数据,data_指针是不会变的,因为他是缓冲区的首地址; const char* debugString();//增加\0,将当前数据变成字符串测试:原创 2021-06-06 19:22:27 · 273 阅读 · 2 评论 -
(P20)muduo_base库源码分析:日志作用,日志级别,Logger使用时序图
文章目录错误分为:编译,运行(可以把errno对应的错误文本信息记录到日志中),逻辑错误(将整个程序的运行状态输出到日志中,通过分析日志可以理清楚程序逻辑,从而找出逻辑错误)muduo库默认是INFO级别修改muduo库的默认日志级别Logger::LogLevel initLogLevel(){ return Logger::TRACE; /* if (::getenv("MUDUO_LOG_TRACE")) return Logger::TRACE; else if (原创 2021-06-06 16:50:53 · 259 阅读 · 0 评论 -
(P19)muduo_base库源码分析:ThreadLocalSingleton封装
文章目录1.ThreadLocalSingleton封装1.ThreadLocalSingleton封装类图如下:线程本地单例类封装,每个线程都有一个T类型的单例对象eg:src\19\jmuduo\muduo\base\ThreadLocalSingleton.heg测试:src\19\jmuduo\muduo\base\tests\ThreadLocalSingleton_test.ccsrc\19\jmuduo\muduo\base\tests\CMakeLists.tx原创 2021-06-06 15:33:32 · 237 阅读 · 0 评论 -
(P18)muduo_base库源码分析:线程特定数据,ThreadLocal类的封装
文章目录2.线程特定数据线程本地存储,ThreadLocal类的封装2.线程特定数据pthread_key_create一旦一个线程创建了一个key,其他线程都有这个keypthread_key_delete删除key,并不是删除数据;删除数据需要在pthread_key_create时,指定一个回调函数去销毁,因为这个数据是堆上数据pthread_getspecific获取不同的线程可以通过这个key来访问这个数据pthread_setspecific为特定的线程指定特定的原创 2021-06-05 11:41:05 · 244 阅读 · 1 评论 -
(P17)muduo_base库源码分析:线程安全Singleton类实现
文章目录1.线程安全Singleton类实现1.线程安全Singleton类实现线程安全Singleton类实现pthread_onceatexittypedef char T_must_be_complete_type[sizeof(T) == 0 ? -1 : 1];类图+号表示公有的,-号表示私有的。使用模板方式实现eg:src\17\jmuduo\muduo\base\Singleton.h测试eg:src\17\jmuduo\muduo\base\tests\S原创 2021-06-05 10:41:06 · 235 阅读 · 0 评论 -
(P16)muduo_base库源码分析:ThreadPool实现
文章目录1.ThreadPool实现1.ThreadPool实现也是生产者消费者问题。ThreadPool创建了若干线程,维护了一个线程队列;这些线程是用来执行任务的,所以还维护了一个任务队列;外部的生产者线程往ThreadPool中的任务队列添加任务,一旦任务队列有任务,则唤醒线程队列的线程来执行这些任务,这些线程相当于消费者线程;eg:src\16\jmuduo\muduo\base\ThreadPool.hsrc\16\jmuduo\muduo\base\ThreadPool.原创 2021-06-03 23:28:08 · 219 阅读 · 0 评论 -
(P15)muduo_base库源码分析:BlockinngQueue(无界阻塞队列),BoundedBlockingQueue(有界阻塞队列)
文章目录1.BlockinngQueue(无界缓冲区)2.BoundedBlockingQueue(有界缓冲区)1.BlockinngQueue(无界缓冲区)为了保证生产者线程和消费者线程安全访问队列,可以使用信号量和条件变量对队列进行同步。使用信号量的方式(1)队列是有界的size:队列的大小;2个信号量:semFull(size)表示初始状态队列是空的,可以生产的产品个数=size;semEmpty(0)表示初始状态队列是空的,可以消费的产品个数=0;生产者线程如何操作队列?//生原创 2021-06-02 22:41:39 · 479 阅读 · 0 评论 -
(P6)epoll:epoll的两种触发模式,select/poll/epoll对比
文章目录epoll的LT和ET模式对比LT:电平触发(1)EPOLLIN事件什么时候触发呢?内核中的socket接收缓冲区为空,可以理解为低电平,不会触发EPOLLIN事件;内核中的socket接收缓冲区不为空,可以理解为高电平,即使缓冲区的数据没有读完,仍然会触发EPOLLIN事件,直到读完为止(2)EPOLLOUT事件内核中的socket发送缓冲区不满,可以理解为高电平内核中的socket发送缓冲区满,可以理解为低电平(3)LT是高电平触发ET:边沿触发低电平->高电平,会原创 2021-05-31 23:17:38 · 516 阅读 · 0 评论 -
redis快速上手
文章目录1.redis特点2.redis安装与使用1.redis特点nosql数据库,只存储key-value形式的数据存储5种数据格式,key只有string类型,value对应有5种list是链表或者数组,set是集合(数学意义上就是没有重复数字),zset就是有序集合2.redis安装与使用网址:https://github.com/tporadowski/redis/releases下载的是window的release版本的安装:在解压目录打开CMD,然后运行redis-原创 2021-02-22 23:01:37 · 204 阅读 · 0 评论 -
rpc和grpc和protobuf
文章目录1.rpc2.grpc1.rpceg:计算a+b=?的函数RPC指的是将a+b=?的功能的函数封装在另外一台server机器上,而client机器只需将参数a和b打包发送到server端,server端运行完毕后,打包发送给client端。为什么需要RPC?client运行的一个程序完成的A功能,但是A功能需要B功能,但是client他没有B功能,所以需要server端提供B功能的结果,通过调用B功能的集群,来获取他们的结果http和rpc的区别?其实问的是http,swift,grp原创 2021-01-10 18:31:48 · 1495 阅读 · 0 评论