网站搜索引擎优化建议学校专业群建设专题网站

news/2025/10/8 18:09:34/文章来源:
网站搜索引擎优化建议,学校专业群建设专题网站,大区直播间网站开发制作,即墨今天新闻大事到这里#xff0c;我们需要整理一下之前学习的epoll模型#xff0c;并根据之前的epoll模型#xff0c;提出弊端#xff0c;进而整理epoll反应堆模型#xff0c;进一步深刻理解#xff0c;这是因为epoll实在是太重要了。 复习之前的epoll的整体流程以及思路。 参考之前写…到这里我们需要整理一下之前学习的epoll模型并根据之前的epoll模型提出弊端进而整理epoll反应堆模型进一步深刻理解这是因为epoll实在是太重要了。 复习之前的epoll的整体流程以及思路。 参考之前写的epoll的代码 第一步socket创建套接字。 int listenfd Socket(AF_INET, SOCK_STREAM,0); 第二步setsockopt 设定端口复用 int opt 1; Setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, opt, sizeof(opt)); 第三步 bind函数将socket和地址结构绑定 Bind(listenfd, (struct sockaddr *)servaddr,sizeof(servaddr)); 第四步Listen 设置可以同时监听的最大的数量为1024 Listen(listenfd, 1024); 第五步Epoll_create 创建一个红黑树结点,建议的节点0 int epfd Epoll_create(OPEN_MAX); 第六步Epoll_ctl 先将listenfd添加到 epfd这个红黑树上EPOLL_CTL_ADD表示是添加节点.EPOLLIN表示监听读事件 struct epoll_event event;     bzero(event, sizeof(event));     event.events EPOLLIN;      event.data.fd listenfd;     //epoll_ct 函数的目的是给这颗红黑树上添加节点删除节点修改节点     Epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd, event); 第七步epoll_wait,这时候就需要弄一个循环监听了, 使用 epoll_wait函数等待连接 while (1) {         //epoll_wait返回值nready为满足监听的总个数。realevents是传出参数传出满足监听条件的所有的结构体         nready epoll_wait(epfd, realevents, OPEN_MAX, -1); } 第7.1步 epoll_wait返回后如果realevents 中的是listenfd说明有客户端第一次连接过来需要使用accpet去接受这个链接生成clientfd int clientfd Accept(listenfd, (struct sockaddr *)cliaddr, cliaddrlen); 然后将这个clientfd添加到红黑树上。 Epoll_ctl(epfd, EPOLL_CTL_ADD, clientfd, clientevent); 第7.2步 epoll_wait返回后如果realevents 中的是clientfd那么说明客户端有发真正的数据过来需要使用read 函数去读取这些数据完成我们对于数据的处理然后再使用write发给客户端 realreadnum Read(socketfd, buf, MAXLINE); //将读到的数据做处理我们这里只是小写转大写。 for (int j 0; j realreadnum; j) {         buf[j] toupper(buf[j]); } Write(socketfd, buf, realreadnum); 这里会有问题这是因为在网络环境下环境是很复杂的例如客户端的 滑动窗口 已经满了 fix 方案epoll 反应堆模型 接上述条件因此在这里我们需要判断客户端是否能写如果能写也就是说我们需要将 clientfd 的 “写事件” 加入到红黑树上。写完后将 clientfd 的“写事件” 从红黑树上摘下。 还有一个问题当我们接受的这些数据还没有处理的时候我们不希望从 clientfd 再 “读取数据”因此还需要将 clientfd 的“读事件” 从 红黑树上摘下等待 给客户端 写数据完成后再将 读取数据事件  添加回 红黑树上。 整个整理如下 如果realevents中是clientfd-------- read 数据 --------将clientfd 从红黑树上摘下将clientfd 的 读事件通过epoll_del  从 红黑树上摘下 --------将clientfd 的写事件 通过epoll_ctl上添加到红黑树上 --------当epoll_wait的返回时如果返回中有 写事件 再使用write /send 发送数据给客户端 --------当发送数据完成后则将clientfd 的写事件从红黑树上摘下 --------将clientfd 的读事件再次添加到红黑树上从而形成循环 epoll反应堆模型的再次说明 在epoll反应堆模型之前我们需要使用到 epoll_event 中的 data 中的 fd来决定具体是那个连接 struct epoll_event {uint32_t events; /* Epoll events */epoll_data_t data; /* User data variable */ } __EPOLL_PACKED; typedef union epoll_data {void *ptr;int fd;uint32_t u32;uint64_t u64; } epoll_data_t; 在epoll反应堆的时候我们需要使用到 epoll_event 中的 data 中的 ptr 因为ptr是一个万能指针可以指向任何东西因此一般使用的时候会有一个struct将相关的信息都放在这个struct中且这个ptr就指向这个ptr这样就能保存所有的信息且会将 epoll_wait成立需要调用的方法通过回调函数的形式添加到这个struct中 实际上是多了个参数的使用   ET NONBLOCK  轮询 void *ptr #include stdio.h #include stdlib.h #include unistd.h #include string.h #include arpa/inet.h #include ctype.h #include sys/types.h #include sys/socket.h #include errno.h #include sys/select.h #include sys/epoll.h#include wrap.h #define MAXLINE 8192 #define SERV_PORT 8000 #define OPEN_MAX 5000int main() {int ret 0;//第一步socket创建套接字。On success, a file descriptor for the new socket is returnedint listenfd Socket(AF_INET, SOCK_STREAM,0);//第二步setsockopt 设定端口复用,代码是固定的当opt是1的时候说明可以复用端口。 On success, zero is returned for the standard options. On error, -1 is returned, and errno is set appropriately.int opt 1;Setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, opt, sizeof(opt));//第三步 bind函数将socket和地址结构绑定//int Bind(int fd, const struct sockaddr *sa, socklen_t salen)struct sockaddr_in servaddr;bzero(servaddr, sizeof(servaddr));servaddr.sin_family AF_INET;servaddr.sin_port htons(SERV_PORT);servaddr.sin_addr.s_addr htonl(INADDR_ANY);Bind(listenfd, (struct sockaddr *)servaddr,sizeof(servaddr));//第四步设置可以同时监听的最大的数量为1024如果改成5000会不会错呢Listen(listenfd, 1024);//Listen(listenfd, OPEN_MAX);//第五步创建一个红黑树结点,我们建议这个红黑树的节点为5000int epfd Epoll_create(OPEN_MAX);//第六步先将listenfd添加到 epfd这个红黑树上EPOLL_CTL_ADD表示是添加节点.EPOLLIN表示监听读事件struct epoll_event event;bzero(event, sizeof(event));event.events EPOLLIN; event.data.fd listenfd;//epoll_ct 函数的目的是给这颗红黑树上添加节点删除节点修改节点Epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd, event);//第七步这时候就需要弄一个循环监听了, 使用 epoll_wait函数等待连接struct epoll_event realevents[OPEN_MAX];int nready 0;while (1) {//epoll_wait返回值nready为满足监听的总个数。realevents是传出参数传出满足监听条件的所有的结构体nready epoll_wait(epfd, realevents, OPEN_MAX, -1);if (nready -1) {perr_exit(epoll_wait error);}for (int i 0; i nready;i) {if (!(realevents[i].events EPOLLIN)) {//如果不是读事件, 继续循环continue;}int socketfd realevents[i].data.fd;if (socketfd listenfd) {//如果是listenfd 的读事件说明有新的链接过来了这时候要调用accpetstruct sockaddr_in cliaddr;int cliaddrlen sizeof(cliaddr);bzero(cliaddr, cliaddrlen);printf(aaa\n);int clientfd Accept(listenfd, (struct sockaddr *)cliaddr, cliaddrlen);char str[INET_ADDRSTRLEN] {0};//#define INET_ADDRSTRLEN 16printf(received from %s at PORT %d\n,inet_ntop(AF_INET, cliaddr.sin_addr, str, sizeof(str)),ntohs(cliaddr.sin_port));//然后将connfd添加到红黑树上struct epoll_event clientevent;bzero(clientevent, sizeof(clientevent));clientevent.events EPOLLIN;clientevent.data.fd clientfd;Epoll_ctl(epfd, EPOLL_CTL_ADD, clientfd, clientevent);}else {//如果不是listenfd那么就是connectfd了说明这时候客户端有东西写过来我们要从客户端读取数据char buf[MAXLINE] {0};int realreadnum;REREADPOINT:realreadnum Read(socketfd, buf, MAXLINE);if (realreadnum 0) {//在网络环境下read函数返回0说明是对端关闭了也就是说客户端关闭了//那么就应该关闭当前的connect端并将该监听从 红黑树上 移除printf(read done\n);Epoll_ctl(epfd, EPOLL_CTL_DEL, socketfd, NULL);Close(socketfd);}else if (realreadnum -1) {if (errno EINTR) {//说明是被信号打断的一般要重新readprintf(信号打断\n);goto REREADPOINT;}else if (errno EAGAIN || errno EWOULDBLOCK){printf( WOULDBLOCK \n);//说明在打开文件的时候是使用的O_NONBLOCK方式打开的但是没有读取到数据//当前代码是不会走到这里的因为前面代码select的最后一个参数用的NULL是阻塞的//一般在这里 也要重新读但是这里有个问题如果一直都读取不到会不会死循环goto REREADPOINT;}else if (errno ECONNRESET) {//ECONNRESET 说明连接被重置了因此要将该cfd关闭并重新移除监听队列printf(read done\n);Epoll_ctl(epfd, EPOLL_CTL_DEL, socketfd, NULL);Close(socketfd);}else {//这就是真正的有问题了注意这里不要exit程序应该只是让打印log//不退出程序是因为这时候还有其他的链接连上的perror(read num 0);}}else if (realreadnum 0) {//真正的读取到了客户端发送过来的数据for (int j 0; j realreadnum; j) {buf[j] toupper(buf[j]);}Write(socketfd, buf, realreadnum);Write(STDOUT_FILENO, buf, realreadnum);}}}}Close(listenfd);Close(epfd);return ret; }

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

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

相关文章

网站怎么伪静态网站上线是前端还是后端来做

目录 1.CString数据转化为int类型数据 2.int类型转化为CString类型数据 3.MFC中CString数据类型 转换为std::string数据类型 4.MFC中std::string数据类型 转换为CString数据类型 1.CString数据转化为int类型数据 在MFC中,将CString类型数据转换为int类型数据&a…

电商门户网站最美情侣免费观看

Jvm垃圾回收器cms和g1区别 G1垃圾回收器(Garbage First)和CMS (Concurrent Mark-Sweep)垃圾回收器是Java虚拟机(JVM))中的两种不同的垃圾回收策略,它们各有优缺点。以下是两者的比较…

北流做网站网页制作工具按其制作方式可分为

1、python介绍及与其它开发语言比较: 相比C、Java运行慢,但是代码简介,可以减小学习成本,加快项目进度。跨平台,支持Linux和Windows。 C语言是所有高级语言的基础,若要研究python语言的原理,需要…

JAVA语法基础》动手动脑与实验问题全整理

一、枚举类型(Enum)核心问题:枚举是基本数据类型还是引用类型?验证方法:使用和equals()比较枚举值。结论:枚举是引用类型,但相同值的枚举变量指向同一个对象,因此和equals()比较结果相同。 二、变量屏蔽…

崩铁壁纸

本人(KK_SpongeBob)蒟蒻,写不出好文章,但转载请注明原文链接:https://www.cnblogs.com/OIer-QAQ/p/19129921

PotPlayer 播放器

PotPlayer 播放器 快捷键 快进(左右) 音量(上下)

国内的平面设计网站wordpress配置网络

1. 题目 我们有一个项的集合&#xff0c;其中第 i 项的值为 values[i]&#xff0c;标签为 labels[i]。 我们从这些项中选出一个子集 S&#xff0c;这样一来&#xff1a; |S| < num_wanted对于任意的标签 L&#xff0c;子集 S 中标签为 L 的项的数目总满足 < use_limit…

10.8动手动孬

代码展示了方法重载的特殊之处,具体分析如下:特殊点:存在两个名为 square 的方法,一个接收 int 类型参数,返回 int 类型;另一个接收 double 类型参数,返回 double 类型。 原理:方法重载是指在同一个类中,允许…

[迷宫寻路 Round 3] 七连击

转化题意:求将一段序列划分为8段,求所有方案的前七段的每一段gcd的和的和. 首先朴素的dp很容易想到,设\(dp(i,j)\)为将前\(i\)位划分为前\(j\)段的答案,\(g(i,j)\)为将前\(i\)位划分为前\(j\)段的方案数. 于是有 \[\b…

Flink03-学习-套接字分词流自动写入工具 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

[笔记]树论笔记+做题记录

树的性质树上任意两点间恰有一条简单路径。树上所有节点度数和为 \(O(n)\) 的。树上 \(m\) 个点两两产生的 LCA 去重后不超过 \(m-1\) 个。Proof:考虑找 LCA 的过程,两个点向上跳,重合时合并成一个点。最后剩下 \(1…

云服务器部署大数据组件

大数据集群规划hw101 hw102 hw103HDFS NameNodeDataNode DataNode SecondaryNameNodeDataNodeYARN NodeManager ResourceManagerNodeManager NodeManagerZookeeper QuorumPeerMain QuorumPeerMain QuorumPeerMainHive …

做a视频网站有哪些要制作自己的网站需要什么

目录 LNMP部署--nginx 搭建mysql数据库 安装mysql的过程&#xff1a; 部署PHP&#xff1a; ​编辑​编辑php的配置文件在哪 wordpress程序安装 LNMP部署--nginx 纯净--联网状态 环境变量中没有nginx 安装形式的选择&#xff1a; yum安装&#xff1a;自动下载安装包及…

wordpress金融网站模板正能量网站免费入口有限公司

华为云与伙伴共同打造联合解决方案 已成为更多企业的数字化转型利器 1月恒驰上云规划实施解决方案 完成上市宣讲并正式上架华为云官网 恒驰上云规划实施解决方案能力全景图&#xff1a;融合厂商云服务能力&#xff0c;一站式高效云迁移 从深入了解企业的本地IT环境、业务特点…

网页制作与网站建设技术大全 pdf公司形象vi设计

目录 一.基本查询回顾 二. 多表查询 三.自连接 四.子查询 1.单行子查询 2.多行子查询 3.多列子查询 4.在from子句中使用子查询 5.合并查询 一.基本查询回顾 准备数据库&#xff1a; 查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为…

网课一

网课一下载安装了anaconda

购物网站开发分工都匀经济开发区建设局网站

今天小编为大家送上几条新闻了&#xff1a;1 微软给Edge浏览器添加离线小游戏谷歌浏览器在不联网的情况下&#xff0c;会有一个小恐龙跳一跳的游戏&#xff0c;而最近换上chromium内核的edge&#xff0c;也添加了自己的离线小游戏。这是一款冲浪游戏&#xff0c;非常类似于微软…

规模化网站SSL证书终极方案

对于拥有大量域名、子域名或需要频繁签发证书的企业和个人,单个购买商业证书成本极高,管理更是噩梦。最具性价比的方案核心在于:自动化 + 免费证书 + 集中管理。 一、 核心原则:为何这是最佳性价比方案? 成本为零…

极智项目 | 基于PyQT+Whisper实现的语音识别软件设计 - 指南

极智项目 | 基于PyQT+Whisper实现的语音识别软件设计 - 指南2025-10-08 17:39 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !importa…

详细介绍:saveOrUpdate 有个缺点,不会把值赋值为null,解决办法

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …