织梦网站导航如何删除/宁波谷歌seo推广公司

织梦网站导航如何删除,宁波谷歌seo推广公司,昆明做小程序的公司,做网站是用什么技术的在之前我们讲过select是最古老的多路转接方案,古老就意味着他不是很方便使用,他需要用户手动保存fd_set这个位图结构,来表示读写事件的关注与否或者就绪性。 而且由于fd_set的大小是固定的,这就意味着他能管理的套接字文件描述符是…

        在之前我们讲过select是最古老的多路转接方案,古老就意味着他不是很方便使用,他需要用户手动保存fd_set这个位图结构,来表示读写事件的关注与否或者就绪性。

        而且由于fd_set的大小是固定的,这就意味着他能管理的套接字文件描述符是有限的。针对这两个问题,人们研究出来了poll,他一方面不需要用户手动保存位图了,还能让poll管理的文件描述符是无限多的,只要你的内存足够大。

一、Poll的函数原型

参数说明:
  1. fds
    • 类型:struct pollfd *
    • 作用:指向 pollfd 结构体的数组,每个元素描述一个要监控的文件描述符及其关注的事件。正是由于这传的参数是一个结构体数组指针,所以理论上只要你的数组足够大,那么我poll能管理的文件描述符也就越多。
  2. nfds
    • 类型:nfds_t(通常是无符号整数)
    • 作用:数组 fds 中的结构体个数,即要监控的文件描述符数量。
  3. timeout
    • 类型:int
    • 作用:超时时间(毫秒)。
    • 这是一个纯粹的输入型参数,和之前的select不同。
      • timeout > 0:最多等待 timeout 毫秒。
      • timeout == 0:非阻塞模式,立即返回。
      • timeout < 0:无限等待,直到有事件发生。
返回值:
  • > 0:表示有事件发生,返回值为就绪的文件描述符数量。
  • == 0:超时,无任何事件发生。
  • < 0:发生错误,返回 -1 并设置 errno

二、Poll的第一个参数是如何做到不用手动保存的呢?

        可以看到pollfd结构体的成员是这样的,其中第一个成员表示的是文件描述符的值,而第二个第三个成员则是用户需要让内核监控哪些事件、内核返还给用户哪些事件已经就绪了。

        之前我们在使用select的时候,fd_set分为读、写、和异常,他们三个位图就管理了所有的文件描述符,所以造就了其复杂性。但是这里把文件描述符的值和事件分开了,一个pollfd就对应一个文件描述符及其关注的事件。从而让不同文件描述符不用相同的资源,而做到解耦。

三、使用poll的示例

        这个示例和select的大同小异,仅仅更改select为poll

#pragma once
#include <iostream>
#include "socket.hpp"
#include <memory>
#include<poll.h>
#include "InetAddr.hpp"using namespace socket_ns;class PollServer
{const static int gdefaultfd = -1;const static int gnum=1024;public:PollServer(uint16_t port): _port(port), _listensock(std::make_unique<TcpSocket>()), _timeout(1000){}~PollServer() {}void InitServer(){_listensock->BuildListenSocket(_port);for(int i=0;i<gnum;i++){_events[i].fd=gdefaultfd;_events[i].events=0;_events[i].revents=0;}//把listen添加进来_events[0].fd=_listensock->sockfd();_events[0].events=POLLIN;//对读事件关心}void Accepter(){// listen套接字得到一个新连接请求-----读事件就绪// 因为已经就绪了,就不会被阻塞了,即accept不会再等了InetAddr client;SockPtr sock = _listensock->Accepter(&client);if (sock->sockfd() > 0){LOG(DEBUG, "get a new link,client info %s:%d\n", client.Ip().c_str(), client.Port());// 处理(但是这里不能直接处理,如果客户端不发消息那我仍然阻塞了)// 那么如何得知fd底层的数据是否就绪了呢?仍然是select!这些fd都要由select管理起来// 所以select中的文件描述符会越来越多// 只需要将新获得的连接套接字放入到fd_array中即可bool flag = false;// 看辅助数组中有没有空余位置给新fd使用,有则插入for (int pos = 1; pos < gnum; pos++){if (_events[pos].fd == gdefaultfd){flag = true;//将新获得的套接字,加入到poll管理的pollfd数组中_events[pos].fd = sock->sockfd();_events[pos].events=POLLIN;_events[pos].revents=0;LOG(INFO, "add %d to fd_array success!\n", sock->sockfd());break;}}// 遍历完成发现是满的if (flag == false){LOG(WARNING, "Server is Full!\n");// 因为处理不了了,所以直接关闭刚刚获得到的连接的套接字::close(sock->sockfd());}}}void Handler_IO(int i){char buffer[1024];// 这里读就不会阻塞了,因为select已经等过了ssize_t n = ::recv(_events[i].fd, buffer, sizeof(buffer) - 1, 0);if (n > 0){buffer[n] = 0;std::cout << "client say#" << buffer << std::endl;// 回复的时候也需要用select找到就绪的,但任何一个sockfd被创建的时候,他的读写缓冲区一定是空的,我们之前关心读事件,是关心// 读缓冲区有没有数据,所以读天然就是不就绪的,但是写天然是就绪的//  std::string echo_str="[server echo info]";//  echo_str+=buffer;std::string content = "<html><body></h1>hello world</body></html>";std::string echo_str = "HTTP/1.0 200 OK\r\n";echo_str += "Content-Type: text/html\r\n";echo_str += "Cotent-Length:" + std::to_string(content.size()) + "\r\n\r\n";echo_str += content;::send(_events[i].fd, echo_str.c_str(), echo_str.size(), 0);}// 对方把连接关了else if (n == 0){LOG(INFO, "client quit...\n");// 把该文件描述符从fd_array中拿出来::close(_events[i].fd);_events[i].events=0;_events[i].revents=0;_events[i].fd = gdefaultfd;}else{LOG(ERROR, "recv error!\n");}}// 一定有大量的fd就绪,可能是普通sockfd套接字,也可能是linsten套接字void HandlerEvent(){//变量查看合法的fdfor(int i=0;i<gnum;i++){if(_events[i].fd==gdefaultfd){continue;}//合法的文件描述符,判断是否就绪int fd=_events[i].fd;short revents=_events[i].revents;if(revents&POLLIN){//读就绪//判断是listen套接字就绪还是普通文件就绪,进行任务派发if(fd==_listensock->sockfd()){Accepter();}else{Handler_IO(i);}}if(revents&POLLOUT){//写就绪}}}void Loop(){while (1){// 3.调用selectstruct timeval timeout = {3, 0};// 由于select是一个输入输出型参数,所以必须要有一个辅助数组来保存fd信息,用来重置参数int n = ::poll(_events,gnum,_timeout);switch (n){case 0:LOG(DEBUG, "time out\n");break;case -1:LOG(ERROR, "select error\n");break;default:// // 如果事件已经就绪了,但是我没有做处理,则底层会一直通知我,告诉我有文件描述符就绪了,所以下一次调用select就不会再判断了,直接通知LOG(INFO, "have event ready,n: %d\n", n);// 处理HandlerEvent();PrintDebug();break;}// sleep(1);}}void PrintDebug(){std::cout << "fd list:" << std::endl;for (int i = 0; i < gnum; i++){if (_events[i].fd=gdefaultfd){continue;}std::cout << _events[i].fd << " ";std::cout << std::endl;}}private:uint16_t _port;std::unique_ptr<Socket> _listensock;struct pollfd _events[gnum];int _timeout;
};

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

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

相关文章

多层感知机的简洁实现

《动手学深度学习》-4.3-笔记 import torch from torch import nn from d2l import torch as d2l 导入必要的库和模块 net nn.Sequential(nn.Flatten(),nn.Linear(784, 256),nn.ReLU(),nn.Linear(256, 10))def init_weights(m):if type(m) nn.Linear:nn.init.normal_(m.we…

【GoLang】调用llm时提示词prompt的介绍以及使用方式

介绍 提示词是一种与大模型交互的对话格式&#xff0c;它以 JSON 格式定义了一个消息列表&#xff08;messages&#xff09;&#xff0c;包含了系统消息和用户消息。 我们向AI提问时&#xff0c;其实发给AI的都是提示词&#xff0c;别看我们只是简单输入了一句话&#xff0c;…

区间端点(java)(贪心问题————区间问题)

deepseek给了一种超级简单的做法 我是真的想不到 贪心的思路是 局部最优——>全局最优 这种我是真的没有想到&#xff0c;这样的好处就是后面便利的时候可以通过foreach循环直接便利qu的子元素也就是对应的某一个区间, 将一个二维数组变成一维数组&#xff0c;每一个一维…

Qt事件处理(处理鼠标事件、键盘事件、定时器事件、窗口移动和大小变化事件)

事件处理 事件是应用程序内部或者外部产生的事情或者动作的统称。 在 Qt 中&#xff0c;事件是用一个对象来管理一个事件的。所有的事件对象都继承自抽象类 QEvent 。事件包括鼠标事件、键盘事件等&#xff0c;发出自 Qt 或操作系统本身。 处理事件一般通过重写相关的 Event 函…

Apache Hive:基于Hadoop的分布式数据仓库

Apache Hive 是一个基于 Apache Hadoop 构建的开源分布式数据仓库系统&#xff0c;支持使用 SQL 执行 PB 级大规模数据分析与查询。 主要功能 Apache Hive 提供的主要功能如下。 HiveServer2 HiveServer2 服务用于支持接收客户端连接和查询请求。 HiveServer2 支持多客户端…

cfca 申请国密证书流程

之前给某银行开发项目&#xff0c;需要用到cfca国密双证证书&#xff0c;证书类型为企业双证的作为接口加密的密钥。 因为是第一次对接&#xff0c;其中走了不少的弯路&#xff0c;现将申请的流程发布出来做下记录 1、需要找到cfca的相关人员进行测试证书的申请 2、大概1天的…

基于Spring Boot的乡村养老服务管理系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

数字孪生技术如何为制造业开辟新天地?

1. 数字孪生在制造业的崛起背景 1.1 数字孪生的概念演进 “数字孪生”(Digital Twin)一词最早由美国密歇根大学Michael Grieves博士在2002年提出,但当时并未称之为“数字孪生”,而是以“信息镜像模型”描述数字世界与物理世界的映射关系。直到2010年前后,美军、NASA等在…

asp.net core mvc模块化开发

razor类库 新建PluginController using Microsoft.AspNetCore.Mvc;namespace RazorClassLibrary1.Controllers {public class PluginController : Controller{public IActionResult Index(){return View();}} }Views下Plugin下新建Index.cshtml {ViewBag.Title "插件页…

2024年MathorCup数学建模C题物流网络分拣中心货量预测及人员排班解题全过程文档加程序

2024年第十四届MathorCup高校数学建模挑战赛 C题 物流网络分拣中心货量预测及人员排班 原题再现&#xff1a; 电商物流网络在订单履约中由多个环节组成&#xff0c;图1是一个简化的物流网络示意图。其中&#xff0c;分拣中心作为网络的中间环节&#xff0c;需要将包按照不同流…

鸿蒙Flutter开发故事:不,你不需要鸿蒙化

在华为牵头下&#xff0c;Flutter 鸿蒙化如火如荼进行&#xff0c;当第一次看到一份上百个插件的Excel 列表时&#xff0c;我也感到震惊&#xff0c;排名前 100 的插件赫然在列&#xff0c;这无疑是一次大规模的军团作战。 然后&#xff0c;参战团队鱼龙混杂&#xff0c;难免有…

Unity音频混合器如何暴露参数

音频混合器是Unity推荐管理音效混音的工具&#xff0c;那么如何使用代码对它进行管理呢&#xff1f; 首先我在AudioMixer的Master组中创建了BGM和SFX的分组&#xff0c;你也可以直接用Master没有问题。 这里我以BGM为例&#xff0c;如果要在代码中进行使用就需要将参数暴露出去…

JAVA学习--java数组--打印稀疏数组和稀疏数组的还原

1.题目描述 2.代码实现 打印二维数组 public class test04 {public static void main(String args[]){//1.创建一个二维数组11*11&#xff0c;0代表没有棋子&#xff0c;1代表黑&#xff0c;2代表白棋int[][] array1new int[11][11];array1[1][2]1;array1[2][3]2;//输出原…

Day20-前端Web案例——部门管理

目录 部门管理1. 前后端分离开发2. 准备工作2.1 创建Vue项目2.2 安装依赖2.3 精简项目 3. 页面布局3.1 介绍3.2 整体布局3.3 左侧菜单 4. Vue Router4.1 介绍4.2 入门4.3 案例4.4 首页制作 5. 部门管理5.1部门列表5.1.1. 基本布局5.1.2 加载数据5.1.3 程序优化 5.2 新增部门5.3…

vue 点击放大,图片预览效果

背景&#xff1a; 在使用vue框架element组件的背景下&#xff0c;我们对图片的展示需要点击放大(单张)&#xff1b;如果是多张图片&#xff0c;要支持左右滑动查看多张图片(多张)。 单张图片放大&#xff0c;el-image图片组件&#xff0c;或者原生的img标签。 多张图片放大&…

学习笔记--基于Sa-Token 实现Java项目单点登录+同端互斥检测

目录 同端互斥登录 单点登录SSO 架构选型 模式二: URL重定向传播 前后端分离 整体流程 准备工作 搭建客户端 搭建认证中心SSO Server 环境配置 开放认证接口 启动类 跨域处理 同端互斥登录 同端互斥登陆 模块 同端互斥登录指&#xff1a;同一类型设备上只允许单地…

本地生活服务APP开发,市场发展全新商业机遇

随着移动互联网的快速发展&#xff0c;人们的消费和生活习惯发生了巨大改变&#xff0c;本地生活服务市场迎来了发展爆发期&#xff01;从外卖、团购等&#xff0c;人们越来越依赖通过手机APP解决日常生活中的各种需求。对于企业而言&#xff0c;一款完善、多样、便捷的本地生活…

代码随想录算法训练营第五十六天 | 108.冗余连接 109.冗余连接II

108. 冗余连接 卡码网题目链接&#xff08;ACM模式&#xff09;(opens new window) 题目描述 有一个图&#xff0c;它是一棵树&#xff0c;他是拥有 n 个节点&#xff08;节点编号1到n&#xff09;和 n - 1 条边的连通无环无向图&#xff08;其实就是一个线形图&#xff09;…

2024年MathorCup数学建模D题量子计算在矿山设备配置及运营中的建模应用解题文档与程序

2024年第十四届MathorCup高校数学建模挑战赛 D题 量子计算在矿山设备配置及运营中的建模应用 原题再现&#xff1a; 随着智能技术的发展&#xff0c;智慧矿山的概念越来越受到重视。越来越多的设备供应商正在向智慧矿山整体解决方案供应商转型&#xff0c;是否具备提供整体解…

交换机(access端口)

任务&#xff1a;对access有更深入的理解 通过网盘分享的文件&#xff1a;交换机&#xff08;access&#xff09;.zip 链接: https://pan.baidu.com/s/1cMC6Na_1PLo6zOHazFplQQ?pwd23a5 提取码: 23a5 SW1 <Huawei>sys [Huawei]dis vlan The total number of vlans …