用于管理一个具体的 TCP 连接,比如消息的接收与发送,完成用户指定的连接回调 connectionCallback。 TcpConnection 构造时接收参数有 TCP 连接的 sockfd,服务端地址 localAddr,客户端地址 peerAddr,并通过 Socket 封装 sockfd。并用 Channel 管理该 sockfd,向 Channel 注册可读、可写、关闭、出错回调函数 作者:Tanswer_ 发表于 2018/01/17 15:04:45 原文链接 https://blog.csdn.net/Tanswer_/article/details/79085406 阅读:452 继续阅读 >>


杜肖孟 18/01/17 15:04:45
Acceptor 用于 accept 一个 TCP 连接,accept 接受成功后通知 TCP 连接的使用者。Acceptor 主要是供 TcpServer 使用的,其生命期由后者控制。一个 Acceptor 相当于持有服务端的一个 socket 描述符,该 socket 可以 accept 多个 TCP 客户连接,这个 accept 操作就是 Acceptor 实现的。 这里用到了一些封装好 作者:Tanswer_ 发表于 2018/01/12 22:43:03 原文链接 https://blog.csdn.net/Tanswer_/article/details/79048708 阅读:572 继续阅读 >>


杜肖孟 18/01/12 22:43:03
手动管理的弊端 在简单的程序中,我们不大可能忘记释放 new 出来的指针,但是随着程序规模的增大,我们忘了 delete 的概率也随之增大。在 C++ 中 new 出来的指针,赋值意味着引用的传递,当赋值运算符同时展现出“值拷贝”和“引用传递”两种截然不同的语义时,就很容易导致“内存泄漏”。 手动管理内存带来的更严重的问题是,内存究竟要由谁来分配和释放呢?指针的赋值将同一对象的引用散播到程序各 作者:Tanswer_ 发表于 2018/01/11 23:39:30 原文链接 https://blog.csdn.net/Tanswer_/article/details/79039617 阅读:1817 评论:3 查看评论 继续阅读 >>


杜肖孟 18/01/11 23:39:30
主要涉及到的类和实现文件有: Endian.h 提供了字节序转换的函数。 Socket.h/Socket.cc socketfd 的封装,提供了绑定地址、开始listen、接受连接等操作,并可设置套接字选项。 InetAddress.h/InetAddress.cc 套接字地址的封装,提供了多种方式初始化一个地址,还提供方法从地址中拿到 ip 和 port。 SocketsOps.h/ 作者:Tanswer_ 发表于 2018/01/09 15:14:11 原文链接 https://blog.csdn.net/Tanswer_/article/details/79013180 阅读:642 继续阅读 >>


杜肖孟 18/01/09 15:14:11
eventfd 介绍 Linux 2.6.27后添加了一个新的特性,就是eventfd,是用来实现多进程或多线程的之间的事件通知的。 接口 #include int eventfd(unsigned int initval, int flags); 这个函数会创建一个事件对象(eventfd object),返回一个文件描述符,用来实现进程或线程间的等待/通知(wait/notify 作者:Tanswer_ 发表于 2018/01/08 23:22:55 原文链接 https://blog.csdn.net/Tanswer_/article/details/79008322 阅读:2824 评论:1 查看评论 继续阅读 >>


杜肖孟 18/01/08 23:22:55
muduo 的定时器功能由三个 class 实现,TimerId、Timer 和 TimerQueue。 TimerId 类 它唯一标识一个 Timer 定时器。TimerId Class 同时保存Timer* 和 sequence_,这个 sequence_ 是每个 Timer 对象有一个全局递增的序列号 int64_t sequence_,用原子计数器(AtomicInt64)生成。 作者:Tanswer_ 发表于 2018/01/07 15:41:05 原文链接 https://blog.csdn.net/Tanswer_/article/details/78994879 阅读:796 继续阅读 >>


杜肖孟 18/01/07 15:41:05
本文分析一下Reactor模式的实现,关键是三个类:Channel、Poller、EventLoop。 事件分发类 Channel Channel 是 selectable IO channel,负责注册与响应IO事件,包括注册给Poller的 fd 及其监听的事件,以及事件发生了所调的回调函数。 每个Channel对象自始至终只负责一个 fd 的事件分发,封装了一系列该 fd 对应的操 作者:Tanswer_ 发表于 2018/01/06 18:36:02 原文链接 https://blog.csdn.net/Tanswer_/article/details/78990738 阅读:924 继续阅读 >>


杜肖孟 18/01/06 18:36:02
考虑让我的 web server 增加对 PHP 的支持,这就要用到 php 解析器来将客户端请求的 php 文件解析为静态资源,再由我的 web server 将其返回到客户端,php-fpm 就可以来帮我们完成这个工作。可是我的 web server 如何与 php-fpm 通信呢? 接下来就是本文的主角:FastCGI 。FastCGI 实现与测试代码:https://github.com/T 作者:Tanswer_ 发表于 2017/12/23 14:46:54 原文链接 https://blog.csdn.net/Tanswer_/article/details/78879905 阅读:789 继续阅读 >>


杜肖孟 17/12/23 14:46:54
32 位的平台上,线性地址空间为固定的 4GB,并且由于采用了保护机制,Linux内核将这 4GB 分为两部分,线性地址较高的 1GB(0xC0000000 到 0xFFFFFFFF )为共享的内核空间;而较低的 3GB 为每个进程的用户空间。由于每个进程都不能直接访问内核空间,而是通过系统调用间接进入内核,因此所有的进程都共享内核空间。而每个进程都拥有各自的用户空间,各个进程之间不能互相访问彼此的 作者:Tanswer_ 发表于 2017/12/10 14:47:55 原文链接 https://blog.csdn.net/Tanswer_/article/details/78764778 阅读:679 继续阅读 >>


杜肖孟 17/12/10 14:47:55
链接器之所以存在或者产生,基本上是由于程序开发的模块化。这里讲的模块,主要是编译概念上的模块,通常他们按照功能划分,比如一个.c或者.cpp文件就是一个编译单元,就是一个模块,编译后就产生一个.o目标文件。为了最终生成一个可执行文件、静态库或者动态库,就需要把各个编译单元按照特定的约定组合到一起。这里特定的约定指的就是“目标文件格式”,它定义了目标文件、库文件和可执行文件的格式,这里组合这一过程就叫 作者:Tanswer_ 发表于 2017/12/06 15:38:25 原文链接 https://blog.csdn.net/Tanswer_/article/details/78730232 阅读:600 评论:1 查看评论 继续阅读 >>


杜肖孟 17/12/06 15:38:25