- 博客(25)
- 资源 (68)
- 收藏
- 关注
原创 (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 684 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 240 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 261
原创 (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 189
原创 (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 188
原创 (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 306
原创 (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 249 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 247 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 205 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 191
原创 (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 166
原创 (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 196
原创 (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 272
原创 (P28)muduo_base库源码分析:定时器,lower_bound&upper_bound,RVO
返回值优化(Return Value Optimization,简称RVO)是一种编译器优化机制。
2021-06-14 11:27:56 258
原创 (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 387 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 259 2
原创 (P23-P24)多线程与并发服务器设计
文章目录1.循环式/迭代式服务器2.1.循环式/迭代式服务器2.若采用多进程方式fork之后,父进程需要关闭已连接socket,子进程需要关闭监听socket若采用多线程的方式则不需要关闭什么socket容易发生“惊群”现象,客户端连接过来的时候,即多个子进程都处于accept状态,只有一个进程返回值是正确的,其他进程返回失败了。参考:大并发服务器的多线程与并发服务器设计: 常见并发服务器方案...
2021-06-08 23:20:50 350
原创 (P22)muduo_base库源码分析:日志滚动条件
文章目录1.日志滚动条件1.日志滚动条件以下的条件只要满足一个就会进行日志回滚文件大小(例如每写满1G换下一个文件)时间(每天零点新建一个日志文件,不论前一个文件是否写满)一个典型的日志文件名logfile_test.20130411-115604.popo.7743.logbasename含义测试:每次写满196K就换一个新文件0:36:47...
2021-06-07 23:17:42 205
原创 (P21)muduo_base库源码分析:日志类封装,StringPiece类
文章目录1.日志类封装1.日志类封装假设给缓冲区data_中添加2个字节数据,data_指针是不会变的,因为他是缓冲区的首地址; const char* debugString();//增加\0,将当前数据变成字符串测试:
2021-06-06 19:22:27 219 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 204
原创 (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 173
原创 (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 191 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 180
原创 (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 167
原创 (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 396
Docker学习资料总结.7z
2020-02-08
VS code的linux服务器端的离线安装教程
2019-11-09
Scientific.Toolworks.Understand.v4.0.811.Incl.Keygen-AMPED.zip
2019-09-07
vscode的remote ssh中需要的ubuntu服务器中的sshd配置文件
2022-06-19
postgresql数据库插件PG-Strom中Scan算子执行流程分析
2022-03-16
CUDAppt.zip
2021-12-28
Shell编程ppt[C++教程网cppcourse[1].com].zip
2020-05-06
跟我一起学C++.zip
2020-05-06
NetworkProgramming-master.zip
2020-05-06
muduo_server_learn.zip
2020-03-12
cpptools-osx.vsix
2019-12-05
VSCode Cpptools最新版1.40.2版本.7z
2019-12-04
VSCode Cpptools.7z
2019-12-04
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人