
项目(百万并发网络通信架构)
百万并发网络通信引擎架构,采用epoll、select、iocp
<br /><a href="https://github.com/dongyusheng">本专栏Github链接为:https://github.com/dongyusheng/tcp-communications</a>
董哥的黑板报
90后程序员!
展开
-
项目(百万并发网络通信架构)12.2---内存管理之(为服务端添加智能指针)
一、C++智能指针概述在C++标准库中提供了3种智能指针,分别为shared_ptr、unique_ptr、weak_ptr,其中应用场景最多的是shared_ptr 这3种智能指针的语法可以分别参阅: shared_ptr:https://blog.youkuaiyun.com/qq_41453285/article/details/105438328 unique_ptr:https://bl...原创 2020-05-07 16:31:32 · 1335 阅读 · 7 评论 -
项目(百万并发网络通信架构)12.1---内存管理之(内存池的设计)
内存管理做好内存管理:避免内存碎片的产生,使程序长期稳定、高效的运行 内存管理有三个篇幅: 1.内存池:从系统中申请足够大小的内存,由程序自己管理 2.对象池:创建足够多的对象,减少创建释放对象的消耗 3.智能指针:保证被创建的对象,正确的释放 本文介绍内存池的设计一、内存池设计概述因为程序申请与释放内存一般都是使用new和delete,所以我们在程序中重载了new...原创 2020-05-06 22:07:11 · 1469 阅读 · 4 评论 -
项目(百万并发网络通信架构)11.2---将消息的接收与发送分离
一、前言在前面的文章中,我们的服务端在接收到客户端的数据之后,对数据处理完会给客户端回送一个消息,这种做法实际上是低效的,因为在数据recv()接收之后再去调用send(),那么当send()阻塞或速度过慢时,会导致当前线程无法继续向前执行或执行较慢,那么会影响后面recv()的再次调用,从而降低服务端的性能,而且会使缓冲区膨胀二、将消息的接收与发送分离方案我们将recv()之后给客户端...原创 2020-04-26 14:56:32 · 1981 阅读 · 3 评论 -
项目(百万并发网络通信架构)11.1---修改数据接收缓冲区、新增数据发送缓冲区
一、修改数据接收缓冲区在前面的两篇文章中,我们分别为服务端和客户端都设计了数据的接收缓冲区,那两篇文章中的设计中,分别建立了两个缓冲区,一个缓冲区用来先存储从recv()中接收到的数据,然后再拷贝到另外一个缓冲区中进行处理,本文将两个缓冲区改为只只用一个缓冲区。可以参阅:https://blog.youkuaiyun.com/qq_41453285/article/details/105405445、ht...原创 2020-04-26 10:43:01 · 1031 阅读 · 0 评论 -
项目(百万并发网络通信架构)10.4---服务端数据收发的性能瓶颈
前言现在我们把服务端和客户端的代码修改一下,修改为两者互相发送与接收数据一、服务端最终代码主要就是修改CellServer::OnNetMessage()中的代码,使其在接收到数据之后返回数据给客户端#ifndef _EasyTcpClient_hpp_#define _EasyTcpClient_hpp_#ifdef _WIN32 #define FD_SETSIZE 10...原创 2020-04-24 21:51:37 · 1013 阅读 · 0 评论 -
项目(百万并发网络通信架构)10.3---send()函数的极限测试
前言本文进行send()函数的测试,查看在不同的情况下send()函数每秒大概可以执行多少次 因为是对send()函数测试,所以我们用客户端给服务器send()发送数据,不接收数据;服务端只使用recv()函数接收数据,但是不给客户端发送数据 我们使用client给server发送大量数据,但是将client中的send()函数参数3改为1,因此每次只发送1个字节的数据,但是因为单个数据包...原创 2020-04-24 17:47:53 · 1017 阅读 · 0 评论 -
项目(百万并发网络通信架构)10.2---recv()函数的极限测试
待续原创 2020-04-24 15:25:35 · 1900 阅读 · 1 评论 -
项目(百万并发网络通信架构)10.1---服务端select的性能瓶颈与优化
一、测试场景本文测试1000个客户端连接服务端,客户端只发送数据,服务端只接收数据,一方发送一方接收二、客户端的代码如下EasyTcpClient.hppEasyTcpClient.hpp代码没有变化,如下所示#ifndef _EasyTcpClient_hpp_#define _EasyTcpClient_hpp_#ifdef _WIN32 #define WIN32...原创 2020-04-23 09:42:27 · 1051 阅读 · 0 评论 -
项目(百万并发网络通信架构)9.4---多线程客户端服务端最终代码测试
前言前面几篇文章改造好了客户端与服务端的代码,本文进行测试 服务端是多线程的,其业务逻辑代码中用到了多线程 客户端的业务逻辑代码不是多线程的,只是其测试代码main函数中用到了多线程一、测试10000客户端连接客户端测试代码如下这个代码在前面文章介绍过,此处只是将客户端的数量cCount变量改为了10000#include "EasyTcpClient.hpp"#incl...原创 2020-04-22 16:34:09 · 1205 阅读 · 0 评论 -
项目(百万并发网络通信架构)9.3---将服务端改造为多线程(生产者-消费者模式)
一、分离客户端连接与消息处理业务主要的操作有: 建立一个CellServer()类 让CellServer()类处理客户端的消息 #ifndef _EasyTcpClient_hpp_#define _EasyTcpClient_hpp_#ifdef _WIN32 #define FD_SETSIZE 2048 #define WIN32_LEAN_AND_MEAN #...原创 2020-04-22 16:22:49 · 1028 阅读 · 2 评论 -
项目(百万并发网络通信架构)9.2---单线程服务端的性能分析(使用VS Studio性能探测器)
一、概述前面的文章中,服务端的程序都是单线程模式的。连接客户端的请求,接收客户端的数据等等都是在一个线程中完成的,本文将要测试一下在服务端单线程模式下,影响服务端性能的因素主要是哪些二、服务端最终代码如下#ifndef _EasyTcpClient_hpp_#define _EasyTcpClient_hpp_#ifdef _WIN32 #define FD_SETSIZE 2...原创 2020-04-11 17:18:47 · 637 阅读 · 4 评论 -
项目(百万并发网络通信架构)9.1---设计多线程客户端测试程序,分组高频发送数据
一、前言接下来几篇文章中将设计多线程的知识,本篇文章将使用C++11提供的多线程接口设计客户端程序,创建指定数量的客户端,然后将客户端的任务平均到每个线程中进行执行 注意:并不对之前的客户端实现代码EasyTcpClient.hpp做任何修改,是通过设计main()函数,设计多线程客户端测试程序二、代码设计代码设计主要的思想有: 创建一个UI线程,其线程执行函数为cmdThread...原创 2020-04-11 14:13:59 · 824 阅读 · 0 评论 -
项目(百万并发网络通信架构)8---为服务器添加高精度计时器,测量数据处理能力
一、概述在前面的文章中,我们都通过查看系统的资源监视器来查看服务端和客户端数据的传输情况,现在我们自己定义一个计时器,在程序中进行计时,然后统计接收数据的数量二、计时器类的定义(CELLTimestamp.hpp)不同的操作系统都有定义自己的计时器类,并且都可以精确到毫秒微秒,但是为了可移植性,此处我们采用C++11标准提供的计时器类 在程序中新建一个CELLTimestamp.hpp...原创 2020-04-09 23:55:34 · 853 阅读 · 1 评论 -
项目(百万并发网络通信架构)7.5---突破Windows select64限制
一、Windows下fd_set最大值通过查看WinSock2.h可以看到,fd_set中最多能存储64个套接字本文测试修改系统宏定义,并且查看修改之后系统的变化 Unix系统中select的限制一般为1024,如果想要修改Unix的select限制,一般需要修改内核源码,但是一般不这么做,超过select的一般使用epoll调用二、测试1000限制服务端代码修改通过Win...原创 2020-04-09 20:46:03 · 1108 阅读 · 0 评论 -
项目(百万并发网络通信架构)7.4---客户端与服务端间的总体黏包测试及跨平台测试
在前两篇文章中,我们成功的解决了客户端与服务端的黏包现象,本文在不同系统之间进行黏包测试一、测试1:单个客户端与单个服务端之间单向数据发送本次测试时: 客户端向服务端发送数据,服务端收到数据之后,不再给客户端回送数据 因此,本次是客户端只发送数据不接收数据,服务端只接收数据不发送数据 客户端代码(EasyTcpClient.hpp)不需要作任何修改,只需要更改服务端代码(Eas...原创 2020-04-09 17:09:28 · 773 阅读 · 0 评论 -
项目(百万并发网络通信架构)7.3---解决服务端粘包现象(设置接收缓冲区)
待续原创 2020-04-09 14:47:09 · 977 阅读 · 1 评论 -
项目(百万并发网络通信架构)7.2---解决客户端粘包现象(设置接收缓冲区)
待续原创 2020-04-09 13:24:19 · 940 阅读 · 1 评论 -
项目(百万并发网络通信架构)7.1---客户端与服务端的粘包现象演示(网络缓冲区)
客户端代码和服务端代码都使用前面文章所封装的class一、测试1:循环测试发送与接收少量数据(8kb)测试1的过程为: 服务端:服务端代码基本不变,其接收客户端发送过来的数据,在收到数据之后将相应数据回送给客户端 客户端:客户端使用while()循环一直向服务端发送程序 客户端与服务端的每次交互的单个数据包比较小,只有8字节 服务端与客户端代码服务端代码如下:#in...原创 2020-04-09 10:46:33 · 1047 阅读 · 0 评论 -
项目(百万并发网络通信架构)6.2---将服务端端封装为class
一、概述在前面的文章中,客户端的代码都是以面向过程的形式展现,本文将之前客户端的代码封装为一个class原创 2020-04-07 20:20:43 · 755 阅读 · 0 评论 -
项目(百万并发网络通信架构)6.1---将客户端封装为class
一、概述在前面的文章中,客户端的代码都是以面向过程的形式展现,本文将之前客户端的代码封装为一个class二、代码如下MessageHeader.hpp这个头文件包含所有的数据包的格式定义#ifndef _MessageHeader_hpp_#define _MessageHeader_hpp_enum CMD{ CMD_LOGIN, CMD_LOGIN_RESULT...原创 2020-04-07 18:27:09 · 757 阅读 · 0 评论 -
项目(百万并发网络通信架构)5.2---将服务端代码进行跨平台移植(Windows、Unix)
一、跨平台移植概述前面的文章我们的代码都是在Windows下进行编译运行的,现在我们需要将代码移动到Linux和Mac OS操作系统上进行运行 因为Linux和Mac OS底层都是使用Unix内核,因此将代码修改之后,在Linux和Mac OS上面都可以进行编译并运行,不需要单独设计两份二、代码修订代码修订1头文件修订:Windows与Unix下套接字使用的头文件不同,因此需要修...原创 2020-04-04 23:25:40 · 817 阅读 · 0 评论 -
项目(百万并发网络通信架构)5.1---将客户端代码进行跨平台移植(Windows、Unix)
一、跨平台移植概述前面的文章我们的代码都是在Windows下进行编译运行的,现在我们需要将代码移动到Unix和Mac OS操作系统上进行运行二、代码修订代码修订1头文件修订:Windows与Unix下套接字使用的头文件不同,因此需要修订 一些常量定义:Windows下有SOCKET、、INVALID_SOCKET、SOCKET_ERROR等宏的定义,但是Unix没有。通过查看Wi...原创 2020-04-04 21:52:24 · 819 阅读 · 0 评论 -
项目(百万并发网络通信架构)3---将服务端、客户端升级为select模型
一、select函数Unix下的selectUnix下的select函数相关基础语法,可以参阅:https://blog.youkuaiyun.com/qq_41453285/article/details/89607091Windows下的selectWindows下的select函数与Unix下的select函数语法相同,但是有些语言稍有不同 Unix下的select函数其参数1为...原创 2020-04-04 17:01:31 · 1035 阅读 · 0 评论 -
项目(百万并发网络通信架构)4---为客户端添加输入线程
待续原创 2020-04-04 17:47:28 · 725 阅读 · 0 评论 -
项目(百万并发网络通信架构)2---封装网络数据报
一、为什么设计网络数据报在消息交互时使用字符串不安全,且比较麻烦不好处理二、本文案例中用到的数据报格式本文的案例为: 客户端可以输入login来登录服务端,或者输入logout来退出服务端 服务端根据客户端传来的数据,做相应的回复 消息类型枚举//消息的类型enum CMD{ CMD_LOGIN, //登录 CMD_LOGIN_RESULT...原创 2020-04-03 14:40:18 · 1068 阅读 · 0 评论 -
项目(百万并发网络通信架构)1---Windows下Tcp Socket的基本结构(客户端、服务端)
一、服务端代码#define WIN32_LEAN_AND_MEAN#define _WINSOCK_DEPRECATED_NO_WARNINGS //for inet_pton()#include <windows.h>#include <WinSock2.h>#include <iostream>#pragma comment(lib...原创 2020-04-02 23:42:44 · 1724 阅读 · 0 评论