
Linux多线程服务端编程:使用muduo C++网络库
文章平均质量分 90
吃着火锅x唱着歌
这个作者很懒,什么都没留下…
展开
-
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 附录D 关于TCP并发连接的几个思考题与试验
换句话说,faketcp客户端可以一直重复做这三件事情,每次用一个不同的IP:PORT,在服务端创建不计其数的TCP连接,而faketcp客户端自己毫发无损。有兴趣的话,还可以继续扩展,做更多的有关TCP的试验,以进一步加深理解,验证操作系统的TCP/IP协议栈面对不同输入的行为。第一道初级题目是:有一台机器,它有一个IP,上面运行了一个TCP服务程序,程序只侦听一个端口,问:从理论上讲(只考虑TCP/IP这一层面,不考虑IPv6)这个服务程序可以支持多少并发TCP连接?试验的网络配置如图D-2所示。原创 2024-03-03 22:03:53 · 1023 阅读 · 0 评论 -
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 附录C 关于Boost的看法
要用C++程序解析上下文无关文法,作者宁愿用ANTLR(ANother Tool for Language Recognition,一个用于构建语言识别器、解析器和翻译器的工具)来定义词法与语法规则并生成解析器(parser),而不用Boost.Spirit(一个用于构建解析器和生成器的工具库,能够让开发者使用C++中的语法进行递归下降解析和生成操作)。Boost中的很多库是按泛型编程(generic programming)的范式来设计的,对于熟悉面向对象编程的人而言,或许面临一个思路的转变。原创 2024-03-02 16:48:17 · 398 阅读 · 0 评论 -
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 附录B 从《C++ Primer(第4版)》入手学习C++
这是作者为《C++ Primer(第4版)(评注版)》写的序言,文中“本书”指的是这本书评注版。B.1 为什么要学习C++2009年本书作者Stanley Lippman先生应邀来华参加上海祝成科技举办的C++技术大会,他表示人们现在还用C++的唯一理由是其性能。相比之下,Java、C#、Python等语言更加易学易用并且开发工具丰富,它们的开发效率都高于C++。但C++目前仍然是运行最快的语言(见编程语言性能对比网站和Google员工写的语言性能对比论文(http://days2011.scala-l原创 2024-03-02 16:01:56 · 1135 阅读 · 0 评论 -
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 附录A 谈一谈网络编程学习经验
本文谈一谈作者在学习网络编程方面的一些个人经验。“网络编程”这个术语的范围很广,本文指用Sockets API开发基于TCP/IP的网络应用程序,具体定义见A.1.5 “网络编程的各种任务角色”。受限于作者的经历和经验,本附录的适应范围是:1.x86-64 Linux服务端网络编程,直接或间接使用Sockets API。2.公司内网。不一定是局域网,但总体位于公司防火墙之内,环境可控。文本可能不适合:1.PC客户端网络编程,程序运行在客户的PC上,环境多变且不可控。2.Windows网络编程。原创 2024-02-27 11:46:51 · 990 阅读 · 0 评论 -
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第十二章 C++经验谈(二)
要在一个小时内写出正确的、健壮的实现基本不现实,例如sort()(快速排序是本科生数据结构课上就有的内容,但是其工业强度的实现是足以在顶级期刊上发论文的)、nth_element()()、next_permutation(将容器中第N个元素放置在其正确的位置上,并保证该位置之前的元素都不大于它,该位置之后的元素都不小于它)、inplace_merge()等等,约有两成STL algorithm属于此类。在内存不足的情况下,要做in-place位置调换,复杂度是O(NlogN)时间和O(1)空间。原创 2024-02-22 14:54:45 · 885 阅读 · 0 评论 -
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第十二章 C++经验谈(一)
作者对C++的基本态度是“练从难处练,用从易处用”,因此本章有几节“负面”的内容。作者坚信软件开发一定要时刻注意减少不必要的复杂度,一些花团锦簇的招式玩不好反倒会伤到自己。作为应用程序的开发者,对技术的运用要明智,不要为了解决难度系数为10的问题而去强攻难度系数为100的问题,这就本末倒置了。12.1 用异或来交换变量是错误的反转一个字符串,例如把“12345”变成“54321”,这是一个最简单不过的编码任务,即便是C语言初学者也能毫不费力地写出类似如下的代码:// 版本一,用中间变量交换两个数,好代原创 2024-02-22 00:25:41 · 1746 阅读 · 0 评论 -
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第十一章 反思C++面向对象与虚函数(下)
3.图形学中的三维齐次坐标(一种表示三维空间中点的坐标系统,它由四个数值组成,通常表示为(x,y,z,w),其中(x,y,z)是点在三维笛卡尔坐标系中的坐标,w是一个常数,一个点的坐标(x,y,z)可以表示为(wx,wy,wz,w),例如,三维空间中的点(1,2,3)可以表示为(2,4,6,2)、(3,6,9,3)等等)Vector4和对应的4×4变换矩阵Matrix4。代码里看到一句简单的函数调用,实际背后发生的可能是一长串对象构造操作,因此减少无谓的临时对象是C++代码优化的关键之一。原创 2024-02-01 16:26:49 · 666 阅读 · 0 评论 -
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第十一章 反思C++面向对象与虚函数(上)
C++的面向对象语言设施相比其他现代语言可算得上“简陋”,而且与语言的其他部分(better C、数据抽象、泛型)融合度较差(见电子工业出版社出版的《C++ Primer(第4版)(评注版)》第15章)。在C++中进行面向对象编程会遇到其他语言中不存在的问题,其本质原因是C++ class是值语义(关注于数据的值本身,而不是其在内存中的位置,赋值操作通常会进行值的复制,而不是引用的传递),而非对象语义(关注于对象的身份,而不仅仅是其值,赋值通常是引用的传递,即两个变量引用同一个对象)。11.1 朴实的C+原创 2024-01-29 17:44:39 · 1090 阅读 · 0 评论 -
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第十章 C++编译链接模型精要
C++从C语言(本节谈的C语言和C++语言指的是现代的常见的实现(没有特别指明时,可认为是Linux x86-64的GCC),并不限于C标准或C++标准,因为标准里根本就没有提到“程序库(library)”这个概念。另外本节所提的C语言库函数不仅包括C标准中的函数,也包括POSIX里的常用函数,因为在Linux下二者是不分家的,都位于libc.so(.so文件是一种用于在Unix系统上共享库的文件格式,在Windows上,相应的概念是动态链接库(Dynamic Link Library,.dll 文件),原创 2024-01-08 01:14:43 · 1283 阅读 · 0 评论 -
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第九章 分布式系统工程实践(下)
9.8.1 境界1:全手工操作这个大概是高校实验室的水平,分布式系统的规模不大,可能十来台机器上下。分布式系统的实现者为在校学生。系统完全是手工搭起来的,host的IP地址采用静态配置。部署编译之后手工把可执行文件拷贝到各台机器上,或者放到公用的NFS目录下。配置文件也手工修改并拷贝到各台机器上(或者放到每个Sudoku Solver自己单独的NFS目录下)。管理手工启动进程,手工在命令行指定配置文件的路径。重启进程的时候需要登录到host上并kill进程。升级如果需要升级Sudoku So原创 2023-12-23 14:23:45 · 257 阅读 · 0 评论 -
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第九章 分布式系统工程实践(上)
本章谈的分布式系统是指运行在公司防火墙以内的信息基础设施(infrastructure),用于对外(客户)提供联机信息服务,不是针对公司员工的办公自动化系统。服务器的硬件平台是多核Intel x86-64处理器、几十GB内存、千兆网互联、常规存储、运行Linux操作系统。系统的规模大约在几十台到几百台,可以位于一个机房,也可以位于全球的多个数据中心。只有两台机器的双机容错(热备)系统不是本章的讨论范围。服务程序是普通的Linux用户进程,进程之间通过TCP/IP通信。特别是,本章不考虑分布式存储系统,只考虑原创 2023-12-21 01:05:54 · 406 阅读 · 0 评论 -
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第八章 muduo网络库设计与实现(下)
epoll(4)是Linux独有的高效的IO multiplexing机制,它与poll(2)的不同之处主要在于poll(2)每次返回整个文件描述符数组,用户代码需要遍历数组以找到那些文件描述符上有IO事件(见8.1.2的Poller::fillActiveChannels()),而epoll_wait(2)返回的是活动fd的列表,需要遍历的数组通常会小得多。3.发起连接的时候如果发生TCP SYN丢包,那么系统默认的重试间隔是3s,这期间不会返回错误码,而且这个间隔似乎不容易修改。原创 2023-12-13 00:12:23 · 281 阅读 · 0 评论 -
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第八章 muduo网络库设计与实现(上)
本章从零开始逐步实现一个类似muduo的基于Reactor模式的C++网络库,大体反映了muduo网络相关部分的开发过程。本章大致分为三段,为了与代码匹配,本章的小节从0开始编号。注意本章呈现的代码与现在muduo的代码略有出入。1.8.0至8.3介绍Reactor模式的现代C++实现,包括EventLoop、Poller、Channel、TimerQueue、EventLoopThread等class。2.8.4至8.9介绍基于Reactor的单线程、非阻塞、并发TCP server网络编程,主要介绍原创 2023-12-11 23:26:17 · 476 阅读 · 0 评论 -
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第七章 muduo编程示例(下)
7.5 一种自动反射消息类型的Protobuf网络传输方案本节假定读者了解Google Protocol Buffers是什么,这不是一篇Protobuf入门教程。本节的示例代码位于examples/protobuf/codec。本节要解决的问题是:通信双方在编译时就共享proto文件(用于定义数据结构和消息格式,以便进行数据的序列化和反序列化)的情况下,接收方在收到Protobuf二进制数据流之后,如何自动创建具体类型的Protobuf Message对象,并用收到的数据填充该Message对象(即反原创 2023-11-14 21:49:13 · 627 阅读 · 0 评论 -
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第七章 muduo编程示例(上)
本章将介绍如何用muduo网络库完成常见的TCP网络编程任务。内容如下:1.[UNP]中的五个简单协议,包括echo、daytime、time、discard、chargen等。2.文件传输,示范非阻塞TCP网络程序中如何完整地发送数据。3.Boost.Asio中的示例,包括timer2~6、chat等。chat实现了TCP封包与拆包(codec,coder-decoder的简称,编解码器)。4.muduo Buffer class的设计与使用。5.Protobuf(Protobuf(Protoc原创 2023-11-02 23:58:21 · 473 阅读 · 0 评论 -
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第六章 muduo网络库简介
2010年3月作者写了一篇《学之者生,用之者死——ACE历史与简评》(http://blog.youkuaiyun.com/Solstice/archive/2010/03/10/5364096.aspx,ACE是(Adaptive Communication Environment)是一个C++编写的开源框架,用于开发高性能、可伸缩、分布式系统的网络应用),其中提到了作者心目中理想的网络库的样子:1.线程安全,原生支持多核多线程。2.不考虑可移植性,不跨平台,只支持Linux,不支持Windows。3.主要支持原创 2023-10-30 17:24:15 · 797 阅读 · 0 评论 -
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第五章 高效的多线程日志
“日志(logging)”有两个意思:1.诊断日志(diagnostic log)。即log4j、logback、slf4j、glog、g2log、log4cxx、log4cpp、log4cplus、Pantheios、ezlogger等常用日志库提供的日志功能。2.交易日志(trasaction log)。即数据库的write-ahead log、文件系统的journaling等,用于记录状态变更,通过回放日志可以逐步恢复每一次修改之后的状态。本章的“日志”是前一个意思,即文本的、供人阅读的日志,通原创 2023-10-27 02:14:59 · 385 阅读 · 0 评论 -
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第四章 C++多线程系统编程精要
学习多线程编程面临的最大思维方式的转变有两点:1.当前线程可能随时会被切换出去,或者说被抢占(preempt)了。2.多线程程序中事件的发生顺序不再有全局统一的先后关系了。当线程被切换回来继续执行下一条语句(指令)的时候,全局数据(包括当前进程在操作系统内核中的状态)可能已经被其他线程修改了。例如,在没有为指针p加锁的情况下,if (p && p->next) { /* ... */ }有可能导致segfault,因为在逻辑与(&&)的前一个分支evaluate为原创 2023-10-26 01:40:21 · 474 阅读 · 0 评论 -
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第三章 多线程服务器的适用场合与常用编程模型
本文中的多线程服务器指运行在Linux上的独占式网络应用程序。硬件平台为Intel x86-64系列的多核CPU,单路或双路SMP(Symmetric Multi-Processing,对称多处理,它是一种多核处理器架构,其中多个CPU核心共享系统的内存和其他资源,以协同执行并行计算任务)服务器(每台机器一共拥有四个核或八个核,十几GB内存),机器之间用千兆以太网连接。这大概是作者写作时民用PC服务器的主流配置。不考虑分布式存储,只考虑分布式计算,系统的规模大约是几十台到几百台服务器之间。进程(proce原创 2023-10-24 16:53:23 · 638 阅读 · 0 评论 -
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第二章 线程同步精要
并发编程有两种基本模型,一种是message passing,另一种是shared memory。在分布式系统中,运行在多台机器上的多个进程的并行编程只有一种实用模型:message passing。在单机上,我们也可以照搬message passing作为多个进程的并发模型。这样整个分布式系统的架构的一致性很强,扩容(scale out)起来也较容易。在多线程编程中,message passing更容易保证程序的正确性,有的语音只提供这一种模型。线程同步的四项原则,按重要性排列:1.首要原则是尽量最低原创 2023-10-23 00:45:09 · 590 阅读 · 0 评论 -
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第一章 线程安全的对象生命期管理
编写线程安全的类不是难事,用同步原语(synchronization primitives)保护内部状态即可。但对象的生与死不能由对象自身拥有的mutex(互斥器)来保护。如何避免对象析构时可能存在的race condition(竞态条件)是C++多线程编程面临的基本问题,可以借助Boost库的shared_ptr和weak_ptr完美解决,这也是实现线程安全的Observer模式(观察者模式,它是一种行为设计模式,用于定义对象之间的一对多依赖关系,以便当一个对象的状态发生变化时,其所有依赖对象都会得到通知原创 2023-10-20 18:05:21 · 728 阅读 · 0 评论