当前位置: 首页 > news >正文

wordpress 全站不刷新洪山网站建设

wordpress 全站不刷新,洪山网站建设,网上银行官网,山东网站营销seo电话参考博客#xff1a;https://blog.csdn.net/sjsjnsjnn/article/details/128371848 一、poll 介绍 poll 是 Unix/Linux 系统中用于实现多路 IO 复用的一种机制#xff0c;主要用于监控多个文件描述符#xff08;File Descriptor, FD#xff09;的状态变化#xff08;如可…参考博客https://blog.csdn.net/sjsjnsjnn/article/details/128371848 一、poll 介绍 poll 是 Unix/Linux 系统中用于实现多路 IO 复用的一种机制主要用于监控多个文件描述符File Descriptor, FD的状态变化如可读、可写、异常等。它允许程序在单个线程中同时处理多个客户端连接避免了为每个连接创建单独线程的资源开销是高性能网络服务器的基础组件之一。 二、poll 数据结构 poll 基于 pollfd 结构体来管理文件描述符其定义如下 struct pollfd {int fd; // 要监控的文件描述符short events; // 期望监控的事件输入事件short revents; // 实际发生的事件输出事件由内核填充 };events 可设置的事件常用 POLLIN数据可读包括普通数据和带外数据POLLOUT数据可写POLLERR发生错误POLLHUP连接挂断POLLNVAL文件描述符无效 revents 返回的事件是 events 中实际发生的事件的位掩码组合。 我们主要关注表格中标红的事件即可 注 events成员就是用户告诉内核需要关心哪些文件描述符上的哪些事件。revents成员就是右内核告诉用户你让我关心的这些文件描述上的事件有哪些文件描述符已经就绪了。 三、poll 函数原型与参数解析 int poll(struct pollfd fds[], nfds_t nfds, int timeout);参数说明 fdspollfd 结构体数组存储需要监控的文件描述符及事件nfds数组中有效元素的数量需小于 FD_SETSIZE通常为 1024timeout超时时间毫秒 -1永久阻塞直到有事件发生0立即返回不阻塞0等待指定毫秒数超时返回 0 返回值 0发生事件的文件描述符数量0超时无事件发生-1错误如 EINTR 被信号中断或 ENOMEM 内存不足 四、poll的基本工作流程 我们要实现一个简单的poll服务器该服务器要做的就是读取客户端发来的数据并进行打印那么这个poll服务器的工作流程应该是这样的 首先完成基本的套接字创建、绑定和监听。 poll的第一个参数是一个数组结构里面包含了文件描述符、需要关心的事件和实际发送的事件。poll实现的服务器就不需要再利用额外的数组只需要定义出struct pollfd fd_array数组每个数组元素都对应着一个文件描述和所关心的事件只需要内核检测到对应的文件描述符上的事件是否就绪并给予填充。 调用poll函数之前我们需要将监听套接字设置到这个struct pollfd fd_array数组。因为监听套接字的读事件就绪就是有新的连接到来所有是我们要关心的文件描述符。 紧接着不断的事件循环与select不同的是poll不需要每次重新设置文件描述符和相应的事件只要在最初设置好后以后就会一直帮我们关心相应的文件描述符和事件。因为注册事件和实际事件是分开的。 当调用poll函数时poll检测到某些文件描述符有读事件就绪后会将其设置到对应文件描述的结构体中的第三个成员中。已告知用户就可以执行相应的读操作了。 如果读事件就绪是监听套接字则调用accept函数从底层全连接队列中获取已经建立连接好的连接并将这些连接设置到struct pollfd fd_array数组中设置好你所需要关心的事件偏于再次调用poll函数时关心这些连接上的对应事件。 如果读事件就绪是普通的套接字即建立好连接的哪些套接字则调用read函数读取客户端发来的数据并进行打印输出。 当然读事件就绪也可能是因为客户端关闭了连接此时服务器应该调用close关闭该套接字并将该套接字从struct pollfd fd_array数组中清除因为下一次不需要再关心该文件描述符了。 五、基于poll 的服务器设计 5.1 代码实现 下面是封装的socket接口 #pragma once #include iostream #include sys/socket.h #include sys/types.h #include unistd.h #include arpa/inet.h #include cstring #include netinet/in.hclass Sock {public:static int Socket(){int sock socket(AF_INET, SOCK_STREAM, 0);if (sock 0){std::cerr socket error std::endl;exit(1);}return sock;}static void Bind(int sock, uint16_t port){struct sockaddr_in local;memset(local, 0, sizeof(local));local.sin_family AF_INET;local.sin_addr.s_addr INADDR_ANY;local.sin_port htons(port);if (bind(sock, (struct sockaddr *)local, sizeof(local)) 0){std::cout bind error ! std::endl;exit(2);}}static void Listen(int sock){if (listen(sock, 5) 0){std::cerr listen error std::endl;exit(3);}}static int Accept(int sock){struct sockaddr_in peer;socklen_t len sizeof(peer);int fd accept(sock, (struct sockaddr *)peer, len);if (fd 0){return fd;}else{return -1;}}static void Connect(int sock, std::string ip, uint16_t port){struct sockaddr_in server;memset(server, 0, sizeof(server));server.sin_family AF_INET;server.sin_port htons(port);server.sin_addr.s_addr inet_addr(ip.c_str());if (connect(sock, (struct sockaddr *)server, sizeof(server) 0)){std::cout connect sucess std::endl;}else{std::cout connect failed std::endl;exit(4);}} };完整的poll服务器代码 #includepoll.h #includestring#includesock.hpp using namespace std;#define NUM 128 struct pollfd fd_array[NUM]; //pollfd数组 int listen_sock 0;void handle(int index){if(fd_array[index].revents POLLIN){std::cout sock: fd_array[index].fd is ready to read ! std::endl;if(fd_array[index].fd listen_sock){std::cout listen_sock: listen_sock has a new connection ! std::endl;int sock Sock::Accept(fd_array[index].fd);if(sock 0){std::cout get a new connection: sock std::endl;int pos 1;for(pos ; pos NUM ; pos){if(fd_array[pos].fd -1){break;}}if(pos NUM){fd_array[pos].fd sock;fd_array[pos].events 0;fd_array[pos].revents 0;std::cout new connection has been added to fd_array[ pos ] std::endl;}else{std::cout server has been full! std::endl;close(sock);}}}else{std::cout sock: fd_array[index].fd has s read event ! std::endl;char buffer[1024];memset(buffer,0,sizeof(buffer));ssize_t len recv(fd_array[index].fd,buffer,sizeof(buffer),0);if(len 0){std::cout recv failed ! std::endl;exit(2);}else if(len 0){close(fd_array[index].fd);fd_array[index].fd -1;fd_array[index].events 0;fd_array[index].revents 0;std::cout fd_array[ index ] has been set -1 std::endl;std::cout connection has been closed ! std::endl;}else{buffer[len] \0;std::cout sock: fd_array[index].fd send: buffer std::endl;}}} }int main(int argc , char* argv[]){if(argc 2){std::cerr argc 2 std::endl;return 1;}uint16_t port (uint16_t)atoi(argv[1]);listen_sock Sock::Socket();Sock::Bind(listen_sock,port);Sock::Listen(listen_sock);fd_array[0].fd listen_sock;for(int i 0 ; i NUM ; i){fd_array[i].fd -1;fd_array[i].events 0;fd_array[i].revents 0; //由内核填充}std::cout server is listening on: port std::endl;while(true){int timeout -1;int ret poll(fd_array,NUM,timeout);if(ret -1){std::cerr poll error ! std::endl;break;}else if(ret 0){std::cerr poll timeout ! std::endl;continue;}else{for(int i 0 ; i NUM ; i){handle(i);}}}for(int i 0 ; i NUM ; i){if(fd_array[i].fd ! -1){close(fd_array[i].fd);fd_array[i].fd -1;fd_array[i].events 0;fd_array[i].revents 0;}}return 0;}编写Makefile进行编译 CXX gCXXFLAGS -Wall -stdc14SRCS main.cpp OBJS $(SRCS:.cpp.o)TARGET serverall:$(TARGET)$(TARGET):$(OBJS)$(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS)%.o:%.cpp$(CXX) $(CXXFLAGS) -c $ -o $clean:rm -f $(OBJS) $(TARGET).PHONY:all clean 5.2 运行结果 客户端连接服务器 客户端发送信息到服务端 客户端关闭 六、总结 6.1 poll的优缺点 优点 不同与select使用三个位图来表示三个fdset的方式poll使用一个pollfd的指针实现。 pollfd结构包含了要监视的event和发生的event不再使用select“参数-值”传递的方式。接口使用比select更方便。poll并没有最大数量限制 (但是数量过大后性能也是会下降)。 缺点 poll中监听的文件描述符数目增多时 和select函数一样poll返回后需要轮询pollfd来获取就绪的描述符。每次调用poll都需要把大量的pollfd结构从用户态拷贝到内核中。同时连接的大量客户端在一时刻可能只有很少的处于就绪状态, 因此随着监视的描述符数量的增长, 其效率也会线性下降。 6.2 poll与select对比 特性selectpoll数据结构fd_set固定大小数组pollfd 结构体数组最大连接数受限于 FD_SETSIZE通常 1024理论上无固定限制受系统资源限制事件管理基于位掩码需手动重置结构体数组事件独立设置性能线性扫描所有 fdO (n)线性扫描所有 fdO (n)移植性跨平台Unix/Linux/Windows主要用于 Unix/Linux 总结poll 相比 select 解决了 fd_set 大小固定的问题但两者在高并发场景下仍存在共同缺陷每次调用都需遍历所有监控的 fd当连接数较多而活跃连接较少时性能会大幅下降 更多资料https://github.com/0voice
http://www.dnsts.com.cn/news/223198.html

相关文章:

  • 杭州网站开发公司排名龙华网站建设哪家公司好
  • 国外有什么网站是做服装的网站关键词几个最好
  • 慧聪网官方网站标志设计公司成都
  • 婚纱摄影网站源码下载企业网站建设渠道
  • 临湘网站设计公司做网站有用吗
  • 云南百度小程序开发平台seo什么意思
  • 专业做域名的网站吗海南e登记app官网下载
  • 网页游戏网站平台防控政策优化
  • php语言的网站建设电脑软件制作入门教程
  • 电子商务网站建设摘要旅游中山公司网站建设
  • 哪里做网站优化做网站编辑大专可以吗
  • 酒店类网站开发的策略手写签名设计免费版在线
  • 网站开发团队人数构成分析建设网站的可行性
  • 搭建什么网站好简单的企业网站的主页
  • 罗湖高端网站建设费用百度seo怎么样优化
  • 局域网视频网站开发wordpress网站部署
  • 建立网站纯文字版本主流的net快速开发框架
  • 网站建设需要的职位建设银行注册网站的用户名怎么写
  • 网站设置桌面快捷方式免费素材网站视频
  • 邢台提供网站建设公司报价浏览器大全列表下载
  • 房产网站制作建立网站链接结构的基本方式有
  • 教做饮品的网站小程序定制开发app
  • 如何查看网站服务器类型0716网站建设
  • 做网站造假云南建设招标网站
  • 电影网站内页专业装修设计网站
  • 展示网站方案个人网站系统
  • 家用电脑和宽带做网站个性化的个人网站简易
  • 苏州制作企业网站的外贸企业网站推广公司
  • 庄行网站建设关键字优化用什么系统
  • 免费建立自己的网站空间西安搬家公司电话号码