基于多反应堆的高并发服务器【C/C++/Reactor】(中)创建并初始化TcpServer实例

对于一个TcpServer来说,它的灵魂是什么?就是需要提供一个事件循环EventLop(EventLoop),不停地去检测有没有客户端的连接到达,有没有客户端给服务器发送数据,描述的这些动作,反应堆模型能够胜任。当服务器和客户端建立连接之后,剩下的就是网络通信,在通信的时候,需要把接收的数据和要发送的数据存储到一块内存里边,Buffer(Buffer)就是为此量身定制的。另外,如果服务器想和客户端实现并发操作,需要用到多线程。我们提供了线程池ThreadPool(ThreadPool),剩下的事就是把服务器模型里边的代码实现一下,基于服务器的整体流程实现一下TcpConnection

这个TcpConnection就是服务器和客户端建立连接之后,它们是在通信的时候,其实就需要用到Http,如果想要实现一个HttpServer,就需要用到Http协议,再把HttpRequestHttpResponse写出来之后,整个项目的流程就全部走通了。

TcpServer分为几个部分:

  1. 主线程需要有一个Listener(包括端口port,监听的文件描述符listenFd
  2. 主线程的事件循环MainEventLoop(反应堆)
  3. 一个线程池ThreadPool
  4. TcpConnection其实是子线程的任务。服务器与客户端建立连接之后,子线程要是想工作的话,就必须创建一个TcpConnection实例。如果没有这个TcpConnection模块,子线程就不知道在建立连接之后需要做什么事情
struct Listener {int lfd;unsigned short port;
};struct TcpServer {struct Listener* listener; // 监听套接字struct EventLoop* mainLoop; // 主线程的事件循环(反应堆模型)struct ThreadPool* threadPool; // 线程池int threadNum; // 线程数量
};

一、创建并初始化TcpServer实例

(1)初始化监听

// 初始化监听
struct Listener* listenerInit(unsigned short port);
// 初始化监听
struct Listener* listenerInit(unsigned short port) {// 创建一个Listner实例 -> listenerstruct Listener* listener = (struct Listener*)malloc(sizeof(struct Listener));// 1.创建一个监听的文件描述符 -> lfdint lfd = socket(AF_INET,SOCK_STREAM,0); // AF_INET -> (网络层协议:Ipv4) ;SOCK_STREAM -> (传输层协议:流式协议)  ;0 -> :表示使用Tcpif(lfd == -1) {perror("socket");              return -1;}   // 2.设置端口复用int opt = 1;int ret =  setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); if(ret == -1) {perror("setsockopt");return -1;}// 3.绑定struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(port);// 主机字节序(小端)转成网络字节序(大端) 端口的最大数量:2^16=65536addr.sin_addr.s_addr = INADDR_ANY;// 0.0.0.0 ret = bind(lfd,(struct sockaddr*)&addr,sizeof(addr));if(ret == -1) {perror("bind");return -1;}// 4.设置监听ret = listen(lfd,128);if(ret == -1) {perror("listen");return -1;}listener->lfd = lfd;listener->port = port;return listener;
}

(2)创建并初始化TcpServer实例

TcpServer结构与工作原理 

(一)服务器结构

  1. Listener: 监听特定端口,等待客户端的连接请求。主要包括端口和监听的文件描述符
  2. MainEventLoop主线程事件循环(主线程反应堆): 负责接收和处理来自客户端的请求
  3. ThreadPool线程池: 用于处理并发连接每个新连接都会有一个子线程处理
  4. TcpConnection: 每个客户端连接都会有一个对应的TcpConnection实例,用于处理该连接的通信

(二)初始化步骤

(1)创建服务器实例:申请TcpServer结构体的内存空间

(2)初始化Listener:

  • 指定服务器要绑定的本地端口(unsigned short类型)
  • 初始化监听的文件描述符

(3)初始化MainEventLoop主线程的事件循环或反应堆

(4)ThreadPool线程池初始化:根据需要的子线程数量(threadNum)初始化线程池

(5)返回值: 返回初始化完成的TcpServer的地址给调用者

// 初始化
struct TcpServer* tcpServerInit(unsigned short port,int threadNum);
// 初始化
struct TcpServer* tcpServerInit(unsigned short port,int threadNum) {struct TcpServer* tcp = (struct TcpServer*)malloc(sizeof(struct TcpServer));tcp->listener = listenerInit(port); // 创建listenertcp->mainLoop = eventLoopInit(); // 主线程的事件循环(反应堆模型)tcp->threadPool = threadPoolInit(tcp->mainLoop,threadNum); // 创建线程池tcp->threadNum = threadNum; // 线程数量return tcp;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/323460.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

再次拓宽信创生态版图,思迈特与统信软件完成产品兼容适配认证

近日,思迈特软件与统信软件科技有限公司(简称“统信软件”)完成产品兼容性适配互认证,加速国产信创生态化建设进程。 本次测试由商业智能与数据分析软件(简称:Smartbi Insight V11)产品与统信服…

SQL中 Group by Grouping Sets 分组的用法

文章目录 1. 用法2. 语法3. 实际应用3.1 求总和与小计3.2 按多个维度分组3.3 标记小计和总计 1. 用法 将Grouping Sets 运算符添加到Group by 子句中,使用Grouping Set 可以在一个查询中指定数据的多个分组,其结果与针对指定的组执行union all 运算等效…

数据结构基本概念

数据结构 数据结构是相互之间存在一种或多种特定关系的数据元素的集合。它包括数据的逻辑结构、数据的存储结构和数据的基本运算。 数据的逻辑结构 数据的逻辑结构是指数据元素之间的逻辑关系。所谓逻辑关系是指数据元素之间的关联方式或“邻接关系”。 逻辑结构与数据元素本…

GeoServe本地部署结合内网穿透实现远程访问Web管理界面

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现,利用GeoServer可以方便地发布地图数据,允许用户对要素数据进行更新、删除、插入…

DevOps(8)

目录 36.当发出的命令与上次使用时产生的结果不同时,会出现什么问题? 37./usr /local的内容是什么? 38.你如何终止正在进行的流程? 39.如何在命令行提示符中插入注释? 40.什么是命令分组以及他是如何工作的&…

知虾电商(Shopee):东南亚领先电商平台的十大关键特点**

知虾电商(Shopee)作为东南亚地区领先的电子商务平台,由Sea Group(前称Garena)在2015年创立。知虾电商以移动优先的策略迅速崛起,为用户提供了一个便捷、安全的在线购物环境。以下是知虾电商的一些关键特点&…

MapInfo Pro和Python基础知识

MapInfo Pro用户长期以来一直使用MapBasic脚本语言来自动化任务、构建自定义应用程序、创建Pro的特定领域自定义、将Pro与其他工具集成等。 MapBasic主要是一种编译语言,这对非程序员来说有点障碍。 我们确实有MapBasic窗口,它允许MapBasic语句和代码直接…

MongoDB 启动时:服务名无效

1.问题场景 电脑睡眠后,再连接服务发现无法连接,启动服务报:服务名无效。 2.打开服务管理: 发现服务中没有MongoDB的服务 3.解决 (1)先找打MongoDB安装路径,把data文件夹下所有文件删除 &a…

数据分析求职-简历准备

简历在整个求职过程中的重要性不言而喻,今天咱们来聊求职过程中简历准备的那些事儿~ 1. 简历究竟有啥用 求职的流程简单说就是:网申->笔试->面试->offer 其中网申环节,简历100%决定了你的通过与否,这个点大家都知道。…

Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found

IDEA创建spring boot项目的时候,pom.xml 文件中spring-boot-maven-plugin报红。 解决方法: 给spring-boot-maven-plugin指定版本 原因: idea自动找的插件版本是其他版本的,和自己设置的不同,导致idea在本地maven仓库…

十、基本对话框大集合(Qt5 GUI系列)

目录 一、设计需求 二、实现代码 三、代码解析 四、总结 一、设计需求 Qt提供了很多标准的对话框。例如标准文件对话框(QFileDialog)、标准颜色对话框(QColorDialog)、标准字体对话框 (QFontDialog)、标准输入对话框 (QInputDialog) 及消息对话框 (QMessageBox)。本文展示各…

[每周一更]-(第50期):Go的垃圾回收GC

参考文章: https://juejin.cn/post/7111515970669117447https://draveness.me/golang/docs/part3-runtime/ch07-memory/golang-garbage-collector/https://colobu.com/2022/07/16/A-Guide-to-the-Go-Garbage-Collector/https://liangyaopei.github.io/2021/01/02/g…