C++nginx网络开发
C++linux网络通讯开发信号编程epoll详解监听线程池nginx源码深度剖析
昔拉天使
I wanna the world know my existence.
展开
-
9-1 问题1:消息的跳跃发送
一:ServerSendQueueThread():处理发送消息队列的线程如果数据一次发送不完,后续要通过ngx_write_request_handler()函数来完成其余数据的发送;包1,包3,包2解决:a)不解决;b)客户端; 一问一答;实际业务上,也根本没有控制哪个数据包先发给客户端的必要性方案:a)往每个连接中增加标记;挺浪费性能;b)…最终方案:无需处理...原创 2020-04-11 21:56:42 · 163 阅读 · 1 评论 -
8-1 结束语、课程总结
一:课程概要总结二:课程技术总结//完整项目:通讯框架+业务逻辑框架【理解成框架课,也没问题】//项目包括//(1)项目是非常完整的多线程高并发服务器程序//(2)按照包头+包体格式 收,完美的解决了数据粘包的问题//(3)根据收到的数据包 来执行不同的业务逻辑//(4)把业务处理产生的结果数据包正确的返回给客户端//用到的主要开发技术//(1)epoll高并发通讯技术,用的是...原创 2020-04-11 21:55:57 · 850 阅读 · 0 评论 -
7-4 惊群、性能优化大局观
文章目录一:cpu占比与惊群二:性能优化大局观三:性能优化的实施四:配置最大允许打开的文件句柄数五:内存池补充说明目录一:重要软件下载地址二:gcc /g++命令重要参数三:信号相关四:linux top命令查看内存及多核CPU的使用讲述总核数 = 物理CPU个数 X 每颗物理CPU的核数总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数查看物理CPU个数查看每个物理CPU...原创 2020-04-11 19:47:41 · 320 阅读 · 0 评论 -
7-3 超负荷安全处理、综合压力测试
一:输出一些观察信息//每隔10秒钟把一些关键信息显示在屏幕上;//(1)当前在线人数;//(2)和连接池有关:连接列表大小,空闲连接列表大小,将来释放的连接多少个;//(3)当前时间队列大小//(4)收消息队列和发消息队列大小;//打印统计信息的函数:printTDInfo(),每10秒打印一次重要信息;二:遗漏的安全问题思考//(2.1)收到太多数据包处理不过来//限速:e...原创 2020-04-11 09:25:03 · 206 阅读 · 0 评论 -
7-2 控制连入数,黑客--防范及畸形包应对
一:控制并发连入数量//epoll支持高并发:数万,数十万,百万【一台计算机】;//单纯探讨epoll支持多少并发连接,意义不是很大;//并发数量取决于很多因素://(1)你采用的开发技术:epoll,支持数十万并发//(2)你这个程序收发数据的频繁程度,以及具体 要处理的业务复杂程度//(3)你实际的物理内存;可用的物理内存数量,会直接决定你能支持的并发连接//(4)一些其他的tc...原创 2020-04-06 23:58:41 · 256 阅读 · 0 评论 -
7-1 过往总结、心跳包代码实战
一:前面学习的总结//核心架构浓缩总结实现的功能://(1)服务器按照包头包体格式正确的接收客户端发送过来的数据包;//(2)根据手动的包的不同来执行不同的业务处理逻辑;//(3)把业务处理产生的结果数据包返回客户端;//咱们用到的主要技术//(1)epoll高并发通讯技术//(2)线程池技术来处理业务逻辑//(3)线程之间的同步技术包括互斥量、信号量//其他技术:信号,日志打...原创 2020-04-06 16:27:02 · 389 阅读 · 0 评论 -
6-4 LT发数据机制深释、gdb调试浅谈
一:水平触发模式(LT)下发送数据深度解释//在水平触发模式下,发送数据有哪些注意事项;//a)一个问题//通过调用 ngx_epoll_oper_event(EPOLL_CTL_MOD,EPOLLOUT),那么当socket可写的时候, //会触发socket的可写事件,我得到了这个事件我就可以发送数据了;//什么叫socekt可写; 每一个tcp连接(socket),都会有一个...原创 2020-04-05 19:49:10 · 250 阅读 · 0 评论 -
6-3 预发包,多线程资源回收深度思考
一:业务逻辑细节写法说明//_HandleRegister(),_HandleLogIn()里边到底执行什么,是属于业务逻辑代码;写法,大家自己决定//100元, 加血90,加魔80//发送数据代码下节实现二:连接池中连接回收的深度思考//服务器 7*24不间断,服务器稳定性是第一位的;一个服务器,如果不稳定,那么谈别的都是虚的;//稳定性:连接池连接回收问题;//如果客户端【张...原创 2020-04-04 23:36:14 · 335 阅读 · 0 评论 -
6-2 业务逻辑之打通业务处理脉搏实战
一:线程池代码调整及补充说明//支撑线程池的运作主要靠两个函数:pthread_cond_signal(&m_pthreadCond); 触发 //pthread_cond_wait(&m_pthreadCond, &m_pthreadMutex); 等待//《Unix环境高级编程》 11章 线程,11.6.6: 条件变量:m_pthreadCond: ...原创 2020-04-04 17:27:13 · 234 阅读 · 0 评论 -
6-1 业务逻辑之多线程、线程池实战
一:学习方法不但要学习老师编写程序的方法,风格,更要学习老师解决一个问题的思路。编程语言、语法这种东西如果你不会,可以通过学习来解决,但是这种 解决问题的思路, 是一种只可意会难以言传的东西,却恰恰能够决定你在开发道路上走多远的东西,搞程序开发一定要培养自己非常清晰的逻辑思维,不然,这条程序开发之路你会走的特别艰辛;二:多线程的提出用 “线程” 来解决客户端发送过来的 数据包一个进程...原创 2020-03-22 13:51:02 · 608 阅读 · 0 评论 -
5-8 通讯代码精粹之收包解包实战
文章目录一:收包分析及包头结构定义二:收包状态宏定义三:收包实战代码四:遗留问题处理五:测试服务器收包避免推诿扯皮源码:ngx_comm.hngx_c_socket_conn.cxxngx_c_socket.hngx_c_memory.hngx_c_socket_request.cxxngx_c_socket_accept.cxx一:收包分析及包头结构定义发包:采用 包头+包体,其中包头中记录...原创 2020-03-21 18:14:30 · 484 阅读 · 0 评论 -
5-7 ET、LT深释,服务器设计、粘包解决
//一:ET,LT模式深入分析及测试//LT:水平触发/低速模式,这个事件没处理完,就会被 一直触发;//ET:边缘触发/告诉模式,这个事件通知只会出现一次;//普遍认为ET比LT效率高一些,但是 ET编程难度比LT大一些;//ET模式下,如果没有数据可接收,则recv会返回-1//思考:为什么ET模式事件只触发一次[事件被扔到双向链表中一次,被epoll_wait取出后就干掉] ...原创 2020-03-15 12:58:03 · 343 阅读 · 0 评论 -
5-6 通讯代码精粹之epoll函数实战
//一:ngx_epoll_process_events函数调用位置//上节课:epoll_create();epoll_ctl();–我们目前已经做好准备 等待迎接客户端主动发起三次握手连入;//介绍ngx_epoll_process_events();//(i)ngx_master_process_cycle() //创建子进程等一系列动作//(i) ngx_set...原创 2020-03-15 12:56:46 · 200 阅读 · 0 评论 -
5-5 监听端口实战、epoll介绍及原理详析
一:监听端口(1.1)开启监听端口二:epoll技术简介(2.1)epoll概述//(1)I/O多路复用:epoll就是一种典型的I/O多路复用技术:epoll技术的最大特点是支持高并发;//传统多路复用技术select,poll,在并发量达到1000-2000,性能就会明显下降;//epoll,kquene(freebsd)//epoll,从linux内核2.6引入的,2.6之前是...原创 2020-03-15 12:52:31 · 643 阅读 · 0 评论 -
5-4 listen()队列剖析、阻塞非阻塞、同步异步
文章目录一:listen()队列剖析(1.1)监听套接字的队列(1.2)accept()函数(1.3)syn攻击【syn flood】:典型的利用TCP/IP协议涉及弱点进行坑爹的一种行为;二:阻塞与非阻塞I/O三:同步与异步I/O:这两个概念容易和 阻塞/非阻塞混淆;(3.1)I / O复用(3.2)思考题一:listen()队列剖析//listen():监听端口,用在 TCP连接 中的 服...原创 2020-03-14 12:41:30 · 1603 阅读 · 0 评论 -
5-3 TCP状态转换,TIME_WAIT,SO_REUSEADDR
文章目录一:TCP状态转换二:TIME_WAIT状态(二.一)RST标志三:SO_REUSEADDR选项源码:nginx5_3_1_server.cnginx5_3_2_server.c一:TCP状态转换//同一个IP(INADDR_ANY),同一个端口SERV_PORT,只能被成功的bind()一次,若再次bind()就会失败,并且显示:Address already in use /...原创 2020-03-14 12:39:35 · 241 阅读 · 0 评论 -
5-2 TCP三次握手详析、telnet,wireshark示范
一:TCP连接的三次握手//tcp:可靠的,面向连接的协议//udp:不可靠的,无连接的协议//大家必须要懂的TCP的三次握手,只有TCP有三次握手【UDP没有】(1.1)最大传输单元MTU//MTU(Maximum Transfer Unit):最大传输单元;//MTU:每个数据包包含的数据最多可以有多少个字节;1.5K左右;//你要发送100K,操作系统内部会把你这100K数据...原创 2020-03-14 12:36:38 · 710 阅读 · 0 评论 -
5-1 C-S, TCP-IP协议妙趣横生、惟妙惟肖谈
文章目录一:客户端与服务器(1.1)解析一个浏览器访问网页的过程(1.2)客户端服务器角色规律总结二:网络模型(2.1)OSI七层网络模型:(2.2)TCP / IP协议四层模型(2.3)TCP / IP协议的解释和比喻三:最简单的客户端和服务器程序实现代码(3.1)套接字socket概念(3.2)一个简单的服务器端通讯程序范例【看调用了哪些函数:面试官可能 会考】(3.3)IP地址简单谈(3.4...原创 2020-03-14 12:33:47 · 592 阅读 · 0 评论 -
4-5 守护进程及信号处理实战
一:守护进程功能的实现三章二节(1)拦截掉SIGHUP,那么终端窗口关闭,进程就不会跟着关闭(2)守护进程,三章七节,一运行就在后台,不会占着终端。创建守护进程ngx_daemon();/调用ngx_daemon()的时机: worker()子进程创建之前;ps -eo pid,ppid,sid,tty,pgrp,comm,stat,cmd | grep -E ‘bash|PID|ng...原创 2020-03-21 12:04:34 · 240 阅读 · 0 评论 -
4-4 信号,子进程实战,文件IO详谈
文章目录一:信号功能实战二:nginx中创建worker子进程(2.1)sigsuspend()函数讲解三:日志输出重要信息谈(3.1)换行回车进一步示意(3.2)printf()函数不加\n无法及时输出的解释四:write()函数思考(4.1)掉电导致write()的数据丢失破解法五:标准IO库源码:ngx_signal.cxxnginx.cxxngx_process_cycle.cxxngin...原创 2020-03-21 12:04:16 · 266 阅读 · 0 评论 -
4-3 日志打印实战,优化main函数调用顺序
一:基础设施之日志打印实战代码一1-3万行代码,想收获多少就要付出多少,平衡注意代码的保护,私密性日志的重要性:供日后运行维护人员去查看、定位和解决问题;新文件:ngx_printf.cxx以及ngx_log.cxx。ngx_printf.cxx:放和打印格式相关的函数;ngx_log.cxx:放和日志相关的函数;ngx_log_stderr() :三个特殊文件描述符【三章七节】,...原创 2020-03-11 16:30:16 · 186 阅读 · 0 评论 -
4-2 读配置文件、查泄漏、设置标题实战
文章目录一:基础设施之配置文件读取(1.1)前提内容和修改(1.2)配置文件读取功能实战代码二:内存泄漏的检查工具(2.1)memcheck的基本功能,能发现如下的问题;(2.2)内存泄漏检查示范三:设置可执行程序的标题(名称)(3.1)原理和实现思路分析源码部分:ngx_c_conf.hngx_func.hngx_global.hngx_signal.hngx_string.cxxnginx.c...原创 2020-03-11 00:33:42 · 351 阅读 · 0 评论 -
4-1 服务器程序目录规划、makefile编写
一:信号高级认识范例ps -eo pid,ppid,sid,tty,pgrp,comm,stat,cmd | grep -E ‘bash|PID|nginx’用kill 发送 USR1信号给进程(1)执行信号处理函数被卡住了10秒,这个时候因为流程回不到main(),所以main中的语句无法得到执行;(2)在触发SIGUSR1信号并因此sleep了10秒种期间,就算你多次触发SIGUSR1...原创 2020-03-09 00:05:33 · 279 阅读 · 0 评论 -
3-7 守护进程详解、范例演示
一:普通进程运行观察ps -eo pid,ppid,sid,tty,pgrp,comm,stat,cmd | grep -E ‘bash|PID|nginx’a)进程有对应的终端,如果终端退出,那么对应的进程也就消失了;它的父进程是一个bashb)终端被占住了,你输入各种命令这个终端都没有反应;二:守护进程基本概念守护进程 一种长期运行的进程:这种进程在后台运行,并且不跟任何的控制终端关...原创 2020-03-08 17:55:42 · 270 阅读 · 0 评论 -
3-6 fork函数详解、范例演示
文章目录一:fork()函数简单认识fork():一分二; *********(1.1)fork()函数简单范例(1.2)僵尸进程的产生、解决,SIGCHLD二:fork()函数进一步认识三:完善一下fork()代码四:fork()失败的可能性代码1:代码2:(防止僵尸进程的出现)代码3:(fork会将进程一分为二执行接下来的代码)代码4:(父子进程共享内存,当需要操作内存时才会申请内存空间)一...原创 2020-03-08 14:02:06 · 499 阅读 · 0 评论 -
3-5 信号编程进阶、sigprocmask范例
一:信号集一个进程,必须能够记住 这个进程 当前阻塞了哪些信号000000000000000000000我们需要 “信号集 ”的这么一种数据类型(结构),能够把这60多个信号都表示下(都装下)。0000000000,0000000000,0000000000,00,0000000000,0000000000,0000000000,00 (64个二进制位)linux 是用sigset_t结...原创 2020-03-08 00:56:38 · 237 阅读 · 0 评论 -
3-4 Unix-Linux体系结构、信号编程初步
一:Unix/Linux操作系统体系结构类Unix操作系统体系结构分为两个状态 (1)用户态,(2)内核态a)操作系统/内核:用来控制计算机硬件资源,提供应用程序运行的环境我们写的程序,他要么运行在用户态,要么运行在内核态。一般来讲运行在用户态;当程序要执行 一些特殊代码的时候,程序就可能切换到内核态,这种切换由操作系统控制,不需要人为介入;换种角度理解:用户态:最外圈应用程序的活动空间...原创 2020-03-07 22:11:12 · 164 阅读 · 0 评论 -
3-3 信号的概念、认识、处理动作
一:信号的基本概念进程之间的常用通信手段:发送信号,kill 第二章第二节讲过;上节讨论过 SIGHUP信号 :通知(事情通知),用来通知某个进程发生了某一个事情;事情,信号都是突发事件, 信号是异步发生的,信号也被称呼为“软件中断”信号如何产生:a)某个进程发送给另外一个进程或者发送给自己;b)由内核(操作系统)发送给某个进程b.1)通过在键盘输入命令ctrl+c[中断信号],...原创 2020-03-07 18:02:32 · 450 阅读 · 0 评论 -
3-2 nginx源码学法,终端和进程的关系说
一:nginx源码学习方法(1)简单粗暴,啃代码,比较艰苦,需要比较好的基础(2)看书看资料,逃脱不了啃代码的过程(3)跟着老师学,让大家用最少的力气掌握nginx中最有用的东西。架构课程前期学习两个主要任务;(1)泛读nginx中的一些重要代码;(2)把nginx中最重要的代码提取出来作为我们自己知识库的一部分以备将来使用;二:终端和进程的关系(2.1)终端与bash进程ps ...原创 2020-03-07 08:49:12 · 312 阅读 · 0 评论 -
3-1 学习nginx源码前的准备工作
一:nginx源码总述winrar二:nginx源码查看工具visual studio,source Insight,visual stuido Code.采用 Visual Studio Code来阅读nginx源码Visual Studio Code:微软公司开发的一个跨平台的轻量级的编辑器(不要混淆vs2017:IDE集成开发环境,以编译器);Visual Studio Code...原创 2020-03-05 00:14:36 · 227 阅读 · 0 评论 -
2-2 nginx整体结构、进程模型
一:nginx的整体结构(1.1)master进程和worker进程概览(父子关系)启动nginx,看到了一个master进程,一个worker进程ps -ef命令第一列:UID,进程所属的用户id第二列:进程ID(PID),用来唯一的标识一个进程第三列:父进程ID(PPID)。 fork(),worker进程是被master进程通过fork()创建出来的-worker进程是maste...原创 2020-03-04 21:35:29 · 191 阅读 · 0 评论 -
2-1 nginx简介、选择理由、安装和使用
一:nginx简介nginx(2002年开发,2004年10才出现第一个版本0.1.0):web服务器,市场份额,排在第二位,Apache(1995)第一位;web服务器,反向代理,负载均衡,邮件代理;运行时需要的系统资源比较少,所以经常被称呼为轻量级服务器;是一个俄罗斯人(Igor Sysoev),C语言(不是c++)开发的,并且开源了;nginx号称并发处理百万级别的TCP连接,非常稳...原创 2020-03-04 21:32:55 · 231 阅读 · 0 评论 -
linux环境搭建详细介绍
一:windows下的vs2017安装c盘空闲空间尽量不要少于30G。a)安装路径能设置到其他盘符(非c盘符),尽量安装到其他盘;b)安装时只勾选和c++有关的选项,切不可多勾选;c)vs2017社区版(community);二:windows下的虚拟机安装装虚拟机软件(虚拟出一台电脑),然后我们就可以在这个虚拟出来的电脑上来安装一个linux操作系统;装虚拟机软件采用的WMware...原创 2020-03-03 22:47:56 · 389 阅读 · 0 评论 -
linux c++通讯架构实战篇详细介绍
章节总述这是一篇以讲解 网络通讯和架构为主的篇章网络通讯:写自己能够驾驭的网络通讯代码来实现具体的网络通讯功能架构:架构师1)架构师的责任:负责产品/软件 的总体规划设计 ,把掌握的技术整合/融合,从而构成一个产品。2)架构师写代码的问题:从高级或者资深软件开发工程师升上去 比较靠谱程序员:靠代码说话和吃饭的,扎实,从点到面来学;把每一段代码写好,自然就能连成一个面;实战:“商业...原创 2020-03-03 12:43:02 · 1368 阅读 · 0 评论