随笔分类 -  11高并发服务器框架搭建

摘要:一、为什么引入心跳包 常规客户端关闭,服务器端能感知到; 有一种特殊情况,连接断开c/s都感知不到: 拔掉c/s程序的网线; "拔掉网线导致服务器感知不到客户端断开",这个事实,大家一定要知道;那为了应对拔网线,导致不知道对方是否断开了tcp连接这种事,这就是我们引入心跳包机制的原因;超时没有发送来 阅读全文
posted @ 2022-03-21 10:54 豪崽_ZH 阅读(319) 评论(0) 推荐(0)
摘要:"遇到程序崩溃问题,所以需要借助gdb调试来找到崩溃行"; 好在:我们的错误能够重现[必现的错误,是很好找的]; 最怕的就是偶尔出现的bug;有的时候运行三个小时就出现,有的时候运行两天也不出现; a)编译时g++ 要带这个 -g选项;make文件。 b)su进入root权限,然后再输入gdb ng 阅读全文
posted @ 2022-03-17 11:01 豪崽_ZH 阅读(139) 评论(0) 推荐(0)
摘要:一、理解socket可写的概念 每一个tcp连接(socket),都会有一个接收缓冲区 和 一个发送缓冲;发送缓冲区缺省大小一般10几k, 接收缓冲区大概几十k,setsocketopt()来设置;"send(),write()发送数据时", 实际上这两个函数是把数据放到了发送缓冲区,之后这两个函数 阅读全文
posted @ 2022-03-17 10:55 豪崽_ZH 阅读(118) 评论(0) 推荐(0)
摘要:一、框架 // master process ./nginx // worker process //(i)ngx_master_process_cycle() //创建子进程等一系列动作 //(i) ngx_setproctitle() //设置进程标题 //(i) ngx_start_worke 阅读全文
posted @ 2022-03-15 16:44 豪崽_ZH 阅读(252) 评论(0) 推荐(0)
摘要:一、逻辑处理的入口 激发 //入消息队列并触发线程处理消息 g_threadpool.inMsgRecvQueueAndSignal(c->pnewMemPointer); m_MsgRecvQueue.push_back(buf); Call(); pthread_cond_signal(&m_p 阅读全文
posted @ 2022-03-12 10:58 豪崽_ZH 阅读(115) 评论(0) 推荐(0)
摘要:一、线程池处理业务逻辑的必要性 业务逻辑层面,这个就要用多线程处理,所谓业务逻辑:充值,抽卡,战斗; 对于充值,需要本服务器和专门的充值服务器通讯,一般需要数秒到数十秒的通讯时间。此时,必须采用多线程【100个多线程】处理方式,保证用户的需求能够得到及时处理。 线程池好处: 提前创建好一堆线程,并搞 阅读全文
posted @ 2022-03-11 16:16 豪崽_ZH 阅读(419) 评论(0) 推荐(0)
摘要:一、粘包现象出现 a)客户端粘包现象 客户端因为有一个Nagle优化算法要是有三个数据包,则他们可能会被Nagle优化算法直接合并一个数据包发送出去 b)服务器端粘包现象 服务器端两次 recv之间可能间隔100毫秒,那可能在这100毫秒内,客户端这三个包都到了,这三个包都被保存到了服务器端的 针对 阅读全文
posted @ 2022-03-10 14:00 豪崽_ZH 阅读(172) 评论(0) 推荐(0)
摘要:一、总的概况 LT: 水平触发/低速模式,这个事件没处理完,就会被 一直触发; ET: 边缘触发/告诉模式,这个事件通知只会出现一次; 普遍认为ET比LT效率高一些,但是 ET编程难度比LT大一些; 思考: 1.为什么ET模式事件只触发一次?[事件被扔到双向链表中一次,被epoll_wait取出后就 阅读全文
posted @ 2022-03-10 09:57 豪崽_ZH 阅读(246) 评论(0) 推荐(0)
摘要:一、项目代码树梳理 (i)ngx_master_process_cycle() //创建子进程等一系列动作 (i) ngx_setproctitle() //设置进程标题 (i) ngx_start_worker_processes() //创建worker子进程 (i) for (i = 0; i 阅读全文
posted @ 2022-03-08 17:03 豪崽_ZH 阅读(154) 评论(0) 推荐(0)
摘要:一、开启监听端口 1.main流程 2.监听端口 bool CSocekt::ngx_open_listening_sockets()函数的实现 |setsockopt():设置一些套接字参数选项; |setnonblocking():设置该socket为非阻塞的方法 |两种方法:ioctl(soc 阅读全文
posted @ 2022-03-07 10:14 豪崽_ZH 阅读(265) 评论(0) 推荐(0)
摘要:一、阻塞与非阻塞I/O 阻塞与非阻塞I/O 阻塞和非阻塞主要是指调用某个系统函数时,这个函数是否会导致我们的进程进入 sleep()【卡在这休眠】状态而言的; a)阻塞I/O 我调用一个函数,这个函数就卡在在这里,整个程序流程不往下走了【休眠sleep】,该函数卡在这里等待一个事情发生, 只有这个事 阅读全文
posted @ 2022-03-05 22:53 豪崽_ZH 阅读(73) 评论(0) 推荐(0)
摘要:一、listen()队列剖析 listen():监听端口,用在 TCP连接 中的 服务器端 角色; listen()函数调用格式: int listen(int sockfd, int backlog); 要理解好backlog这个参数, “监听套接字 队列”; 监听套接字的队列 对于一个调用 li 阅读全文
posted @ 2022-03-05 22:06 豪崽_ZH 阅读(208) 评论(0) 推荐(0)
摘要:一、三次握手 客户端理解成一个人,服务器端理解成一个人,两个人要用电话通话: 张三:你好,李四,我是张三 [syn] ,ip,端口 李四:你好,张三,我是李四 [syn/ack] 张三:你好,李四 [ack] a)\客户端给服务器发送 了一个SYN标志位置位的无包体TCP数据包,SYN被置位,就表示 阅读全文
posted @ 2022-03-05 20:55 豪崽_ZH 阅读(107) 评论(0) 推荐(0)
摘要:一、服务器 #include <stdio.h> #include <ctype.h> #include <unistd.h> #include <sys/types.h> #include <arpa/inet.h> #include <sys/socket.h> #include <stdlib 阅读全文
posted @ 2022-03-05 17:03 豪崽_ZH 阅读(172) 评论(0) 推荐(0)
摘要:一、如何将一个终端进程更改守护进程 问:为什么要有这个功能呢? 答:解放终端,实现项目中。特别是在后期,程序还需要设置开机自启动的功能。 //创建守护进程 if(p_config->GetIntDefault("Daemon",0) == 1) //读配置文件,拿到配置文件中是否按守护进程方式启动的 阅读全文
posted @ 2022-03-05 15:57 豪崽_ZH 阅读(164) 评论(0) 推荐(0)
摘要:一、父子进程循环 // (i)ngx_master_process_cycle() //创建子进程等一系列动作 (i)| ngx_setproctitle() //设置进程标题 (i)| ngx_start_worker_processes() //创建worker子进程 (i)| | for (i 阅读全文
posted @ 2022-03-04 20:35 豪崽_ZH 阅读(165) 评论(0) 推荐(0)
摘要:一、日志打印格式整理 ngx_printf.cxx以及ngx_log.cxx。 ngx_printf.cxx:放和打印格式相关的函数; ngx_log.cxx:放和日志相关的函数; **ngx_log_stderr():**往屏幕上打印一条错误信息;功能类似于printf,可变参。 printf(" 阅读全文
posted @ 2022-03-04 16:02 豪崽_ZH 阅读(558) 评论(0) 推荐(0)
摘要:一、配置文件读取 使用配置文件,使服务器程序有了极大的灵活性,作为服务器程序开发者,必须要首先搞定的问题。 配置文件格式(内容) #[开头的表示组信息,也等价于注释行 [Socket] ListenPort = 5678 DBInfo = 127.0.0.1;1234;myr;123456;mxdb 阅读全文
posted @ 2022-03-04 10:45 豪崽_ZH 阅读(135) 评论(0) 推荐(0)
摘要:一、工程文件目录规划 主目录名nginx a)_include目录:专门存放各种头文件;如果分散:#include "sfaf/sdafas/safd.h" b)app目录:放主应用程序.c(main()函数所在的文件)以及一些比较核心的文件; ——b.1)link_obj:临时目录,会存放临时的. 阅读全文
posted @ 2022-03-03 20:49 豪崽_ZH 阅读(205) 评论(0) 推荐(0)