
C++百万并发网络通信引擎架构
文章平均质量分 84
C++SOCKET高并发
无休止符
不要让任何事情,成为你不去学习的理由!!!
展开
-
二十一、服务端多线程分组处理多客户端
二十一、服务端多线程分组处理多客户端前言一、生产者与消费者设计模式二、服务端模型图三、服务端代码优化1、分离客户端连接与消息处理业务2、为消息处理线程添加新客户端缓冲队列3、建立消息处理线程a)EasyTcpServer::Start()b)CellServer::Start()4、将新客户端分配给客户端数量最少的消息线程a)CellServer::getClientCountb)EasyTcpServer::Acceptc)EasyTcpServer::addClientToCellServer5、消息处原创 2022-10-24 09:28:33 · 616 阅读 · 0 评论 -
二十、服务端单线程模式下性能瓶颈
二十、服务端单线程模式下性能瓶颈前言一、测试准备二、测试情况分析1、初步分析2、详细分析3、优化分析二、优化结论总结前言之前我们使用多线程优化了客户端的发送性能接来下,我们通过客户端的多线程高频发送来测试服务端单线程下的性能瓶颈一、测试准备服务端 -> #define FD_SETSIZE 4096客户端 -> const int cCount = 4000;const int tCount = 4;客户端使用局域网的另外一台电脑来进行数据发送EasyTcpServer设置原创 2022-01-29 12:46:04 · 2219 阅读 · 0 评论 -
十九、客户端多线程分组模拟高频并发数据
客户端多线程分组模拟高频并发数据前言一、客户端升级模型1、设计概述2、设计思路二、测试1、EasyTcpServer_t1_c1024 -> EasyTcpClient_t1_c1000_m100x12、EasyTcpServer_t1_c1024 -> EasyTcpClient_t4_c1000_m100x13、测试结论三、完整代码1、client.cpp前言之前我们学习了多线程的基础知识,接来我们将使用多线程对客户端进行升级实现客户端多线程分组模拟高频发送数据,来测试服务端的单线程原创 2022-01-29 11:57:38 · 2339 阅读 · 0 评论 -
十八、多线程基础知识(四):自解锁+原子操作
多线程基础知识(四):自解锁+原子操作前言一、自解锁使用二、自解锁消耗测试1、Debug86 -> 每个线程2000万次计算2、Release86 -> 每个线程2000万次计算3、消耗测试结论三、lock_guard原理剖析1、lock_guard源码2、原理分析四、原子操作1、原子操作概念2、使用原子操作优化五、原子操作测试1、Debug86 -> 2000万2、Release86 -> 2000万3、结论分析六、原子操作的反汇编1、Debug86 -> int sum2、原创 2022-01-27 16:53:35 · 1263 阅读 · 0 评论 -
十七、多线程基础知识(三):锁+临界区+锁消耗
多线程基础知识(三):锁+临界区+锁消耗前言一、锁的使用1、锁住整个workFuna)源码b)测试2、仅锁住workFun中couta)源码b)测试二、临界区的概念三、计算中使用锁前言之前的输出例子中发现,cout的时候输出的内容会错乱,这个就是因为不同线程都使用了相同的输出流原因分析:1、线程是抢占式的2、多个线程同时使用了输出流(各自线程并不知道其他线程正在使用输出流)一、锁的使用1、锁住整个workFuna)源码#include<iostream>#inclu原创 2022-01-27 15:46:27 · 950 阅读 · 0 评论 -
十六、多线程基础知识(二):线程启动+线程传参
多线程基础知识(二):线程启动+线程传参前言一、线程启动的两种方式1、detach和join2、detach测试3、join测试二、线程传参的实现三、创建线程数组前言上一节我们介绍了多线程的一些基本概念本篇将针对如何启动线程以及线程传参进行讲解一、线程启动的两种方式1、detach和joindetach:分离线程,可以与主线程一起执行,互不影响join:join要求先执行完线程t的workFun才能继续往下执行主线程#include<iostream>#includ原创 2022-01-27 11:52:47 · 1139 阅读 · 0 评论 -
十五、多线程基础知识(一):基本概念简介
简介+线程启动+传参一、多线程业务模型二、使用多线程就能提升性能吗三、使用多线程的目的四、多线程操作中的共享数据五、CPU核心数1、关于CPU核心的一些概念2、Windows下查看方法3、Linux下查看方法一、多线程业务模型二、使用多线程就能提升性能吗硬件 -> CPU核数=1,核心数=1 -> 使用多线程并不能完全提升性能硬件 -> 多核心CPU -> 大部分情况使用多线程能提升性能多线程尽量用于可以被拆分的任务例如:对于用户登录与数据收发这2种任务来说将原创 2022-01-27 11:19:51 · 258 阅读 · 0 评论 -
十四、多线程与单线程网络程序架构简介
多线程与单线程网络程序架构简介前言一、服务端单线程处理多客户端二、服务端多进程多端口分组处理多客户端三、服务端多线程单端口分组处理多客户端四、服务端多进程多线程多端口分组处理多客户端五、服务端多线程分组处理多客户端前言之前我们都是使用单线程的select网络模型在测试中我们发现,随着连接数的增加,select查询的时间消耗增加,每秒的包处理数下降在当前的select模型下,我们建议单线程处理1000个客户端一、服务端单线程处理多客户端二、服务端多进程多端口分组处理多客户端三、原创 2022-01-27 10:11:51 · 1601 阅读 · 0 评论 -
十三、添加高精度计时器测试性能
添加高精度计时器测试性能前言一、C++11跨平台高精度计时器二、EasyTcpServer.hpp代码优化1、增加CELLTimestamp对象和计数2、OnNetMsg增加计数打印与计数重置3、屏蔽EasyTcpClient.hpp不必要的输出4、client.cpp中增加连接数打印5、服务端连接数上限修改6、服务端在连接的时候不进行消息的收发三、测试1、win10测试,client连接数1002、win10测试,client连接数10003、win10测试,client连接数20004、win10测试,原创 2022-01-26 22:39:22 · 956 阅读 · 0 评论 -
十二、突破Windows下select64限制
突破Windows下select64限制前言一、跨平台select限制查看1、windows下select限制2、Linux下select限制二、超过1024连接的解决方案三、Windows下突破select64限制四、测试1、Windows下测试五、完整源码1、MessageHeader.hpp2、服务端源码a)EasyTcpServer.hppb)server.cpp3、客户端源码a)EasyTcpClient.hppb)client.cpp前言之前的文章,我们解决了在跨平台下收发1000k消息的原创 2022-01-26 18:58:50 · 2060 阅读 · 0 评论 -
十一、粘包(二)双缓冲区解决粘包
粘包(二)双缓冲区解决粘包前言一、客户端粘包解决方案二、服务端粘包解决方案前言在前面一篇文章中我们解决了客户端与服务端网络缓冲区可能会溢出而导致的网络阻塞现象,但是仍然以后一个问题没有解决,就是粘包现象。我们的数据接收端一次性从网络缓冲区中接收上万字节的数据,这些数据是由不同的数据包组成的,因此包与包之间粘在一起一、客户端粘包解决方案在前面我们只为程序设置了一个接收缓冲区,现在我们为程序设置两个接收缓冲区:第一缓冲区(接收缓冲区):_recvBuff,用来存储从网络缓冲区中接收的数据第二原创 2022-01-24 16:46:15 · 815 阅读 · 0 评论 -
十、粘包(一)网络缓冲区
前言之前我们在server和client发送的数据包都比较小例如Login消息长度=68,LoginResult消息长度=8接下来我们来测试消息长度比较大的时候,网络消息收发的情况一、内网不间断测试1、消息长度Login=68,LoginResult=8server和client的select都修改成非阻塞timeval t = { 0,0 };int ret = select(maxSock + 1, &fdRead, &fdWrite, &fdExp, &原创 2022-01-23 17:28:09 · 1181 阅读 · 0 评论 -
九、封装跨平台服务端与客户端
前言之前我们都是在同一份cpp中编写代码与测试本篇开始,我们需要将服务端和客户端的代码封装成class这样我们就可以使用对象的方式创建多个server或多个client一、封装class概述1、头文件包含的处理在Windows下我们可以使用#pragma once来防止重复包含但是为了跨平台的通用性,我们需要使用如下的形式来防止重复包含#ifndef _MessageHeader_hpp#define _MessageHeader_hpp2、封装项目结构消息头文件 ->原创 2022-01-11 17:36:31 · 1070 阅读 · 0 评论 -
八、服务端+客户端跨平台移植Linux、MacOS
前言在上一篇七、服务端和客户端升级为select模型中,我们已经将服务端和客户端升级为了select模型,由于select本身就支持跨平台因此本篇我们将服务端和客户端select程序移植到Linux和MacOS平台Linux和Mac OS底层都是使用Unix内核,因此将代码修改之后,在Linux和Mac OS上面都可以进行编译并运行,不需要单独设计两份一、项目创建与编译1、Linux系统在Liunx中打开TextEditor,另存为client.cpp保存路径:Documents\dev原创 2022-01-11 16:02:17 · 2091 阅读 · 0 评论 -
七、服务端和客户端升级为select模型
前言select模型是跨平台的,Windows、MacOS、Linux中都支持在之前的“Socket网络通信基础”中,服务端和客户端是一对一的本篇将使用select模型将服务端和客户端升级为一对多一、阻塞与非阻塞1、阻塞方式(block)顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,假如事件没有发生,进程或线程就被阻塞,函数不能立即返回。2、非阻塞方式( non-block )就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同原创 2022-01-10 17:11:25 · 861 阅读 · 0 评论 -
六、Socket网络通信基础(三):网络报文消息数据收发
网络报文消息数据收发前言一、网络数据报文格式1、为什么要使用网络报文2、网络数据报文的格式定义二、优化内容1、增加枚举定义:登录、登录结果、登出、登出结果、错误前言在上一篇中Socket网络通信基础(二):结构化的网络消息数据收发我们将消息收发优化成结构化的网络消息接下来,我们将使用网络报文来进行消息的收发本文优化内容1、使用网络报文来进行消息收发2、统一server和client的消息结构一、网络数据报文格式1、为什么要使用网络报文在消息交互时使用字符串不安全,且比较麻烦不好处理原创 2022-01-10 15:04:59 · 2582 阅读 · 0 评论 -
五、Socket网络通信基础(二):结构化的网络消息数据收发
结构化的网络消息数据收发前言一、优化内容1、新增结构化消息DataPackage2、server的while优化3、client持续send逻辑二、测试结果三、server是如何知道client退出的四、完整源码1、server.cpp2、client.cpp前言在上一篇中Socket网络通信基础(一):简易TCP服务端和客户端server使用while循环来持续accept新的client连接但是client连接上server后,在recv接收到server消息后,就退出了本篇优化方向1、让原创 2022-01-07 18:02:23 · 810 阅读 · 0 评论 -
四、Socket网络通信基础(一):简易TCP服务端和客户端
Socket网络通信基础(一):简易TCP服务端和客户端前言一、HelloSocket1、解决方案创建2、test.cpp源码3、test源码说明二、Socket API函数原型1、socket2、sockaddr_in3、htons4、IN_ADDR5、bind6、listen7、listen8、send9、inet_ntoa10、connect11、recv三、简易TCP实现步骤1、用Socket API建立简易TCP服务端步骤2、用Socket API建立简易TCP客户端步骤四、完整源码1、服务端se原创 2022-01-07 15:51:42 · 570 阅读 · 0 评论 -
三、开发环境搭建-Linux
开发环境搭建-Linux一、安装ubuntu1、安装步骤二、Linux下C++项目创建1、建立开发目录2、新建代码文件3、gedit设置4、g++安装5、编译运行一、安装ubuntu版本:ubuntu-18.04.5-desktop-amd641、安装步骤创建虚拟机 -> 典型 -> 安装程序光盘镜像文件(iso)(M)浏览 -> Ubuntu的iso文件地址 -> 下一步个性化Linux -> 设置好后 -> 下一步1)全名 -> “ubunt原创 2022-01-07 14:51:24 · 773 阅读 · 0 评论 -
二、开发环境搭建-MacOS
开发环境搭建-MacOS一、硬件虚拟化检测二、虚拟机安装macOS1.VM解锁Apple Mac OS X(M)2.Mac系统iso下载3.VM中安装MacOS4.macOS系统安装5.mac启动初始化6.Mac中VMTools安装7.Mac文件共享三、macOS安装xcode1.xcode安装包下载2.离线包xcode安装参考三、Xcode工程与设置1.新建Xcode工程2.IDE设置3.快捷键4.工程编译一、硬件虚拟化检测硬件虚拟化检测工具securable -> 检测系统是否支持硬件虚拟化原创 2022-01-07 14:38:23 · 1941 阅读 · 0 评论 -
一、开发环境搭建-Windows
开发环境搭建一、Windows开发环境1、VS2015安装2、VS项目创建3、VS项目属性设置4、VS项目源码二、MacOS开发环境三、Linux开发环境一、Windows开发环境1、VS2015安装自定义安装Visual Studio 2015 更新 3 -> 勾选编程语言 -> C++ -> 勾选Windows和Web开发 -> Microsoft Web 开发人员工具 -> 去掉勾选Windows 8.1 SDK和通用 CRT SDK -> 勾选适原创 2022-01-07 12:31:50 · 1243 阅读 · 0 评论