1:select内部是个数组,而epoll内部结构是红黑二叉树
2:select查询起来慢,而epoll查询起来快
3:每次循环,内部都要发生拷贝(查看相关代码)而epoll不需要这样的操作,也就是初始化一次拷贝
#include
#include<winsock2.h>
#include<windows.h>
#include
#include
int main()
{
std::vectorclients;
WSAData data;
if (WSAStartup(MAKEWORD(2, 2), &data) == SOCKET_ERROR) {
std::cout << (“WSAStartUp Error”) << std::endl;
}
SOCKET socket_fd = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in add_ress;
add_ress.sin_family = AF_INET;
add_ress.sin_port = htons(8080); //绑定端口号
add_ress.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //能够接受任意ip地址消息
bind(socket_fd, (sockaddr*)&add_ress, sizeof(add_ress));
listen(socket_fd, 5);在这里插入代码片
fd_set read_fd;
fd_set temp_fd;
FD_ZERO(&read_fd);
FD_ZERO(&temp_fd);
FD_SET(socket_fd, &read_fd);
TIMEVAL tv;//设置超时等待时间
tv.tv_sec = 1;
tv.tv_usec = 0;
std::size_t max_fd = socket_fd;
while (1) {
temp_fd = read_fd;
//因为底层内部实现会删除temp_fd的集合,因此要加一个局部数据
int ret = select(max_fd + 1, &temp_fd, NULL, NULL, &tv); //最后一个参数表上阻塞
if (ret == -1) {
break;
}
//如果socket_fd在temp_fd集合内,说有事件来了
if (FD_ISSET(socket_fd, &temp_fd)) {
sockaddr_in add_client;
int len = sizeof(add_client);
SOCKET client_fd = accept(socket_fd, (SOCKADDR*)&add_client, &len);
clients.emplace_back(client_fd);
FD_SET(client_fd, &read_fd);
auto fd = std::find_if(clients.begin(), clients.end(), [max_fd](SOCKET fd)->bool {return fd > max_fd;});
if (fd != clients.end()) {
max_fd = *fd; //更新fd
}
}
else {
//其实从这地方也能看出,select的底层结构是数组,
int count = clients.size();
for (int i = 0;i < count;++i) {
if (FD_ISSET(clients[i], &temp_fd)) {
char buffer[100] = { 0 };
int bytes = recv(clients[i], buffer, 100, 0);
if (bytes == -1) {
continue;
}
if (bytes == 0) {//客户端退出了
SOCKET temp_fd = clients[i];
closesocket(temp_fd);
clients.erase(clients.begin()+i);
FD_CLR(temp_fd, &read_fd);
//read_fd.fd_array[i] = 0; //傻逼底层,竟然不删除,垃圾
auto fd = std::find_if(clients.begin(), clients.end(), [max_fd](SOCKET fd)->bool {return fd > max_fd;});
if (fd == clients.end()) {
max_fd = socket_fd;
}
else {
max_fd = *fd; //更新fd
}
continue;
}
else {
//处理消息, 不写了
}
}
}
}
}
}

select的列子说明select内部实现原理相关推荐

  1. 前端必读:浏览器内部工作原理

    前端必读:浏览器内部工作原理 作者: Tali Garsiel  发布时间: 2012-02-09 14:32  阅读: 2133 次  原文链接   全屏阅读  [收藏]   http://kb.c ...

  2. WEB HTTP:浏览器HTTP协议漫谈、请求对象Httprequest、响应对象HttpResponse、浏览器内部工作原理(待完善)

    0 系列目录 WEB请求处理 WEB请求处理一:浏览器请求发起处理 WEB请求处理二:Nginx请求反向代理 WEB请求处理三:Servlet容器请求处理 WEB请求处理四:Tomcat配置实践 WE ...

  3. SQL Server中SELECT会真的阻塞SELECT吗?

    在SQL Server中,我们知道一个SELECT语句执行过程中只会申请一些意向共享锁(IS) 与共享锁(S), 例如我使用SQL Profile跟踪会话86执行SELECT * FROM dbo.T ...

  4. mysql select符合查询_MySQL SELECT 联合查询

    这里主要分享一下联合查询的用法. MySQL使用UNION和UNION ALL实现数据的联合查询. 假设有以下两个表: mysql>select * from staff; +----+---- ...

  5. 彻底解释Linux select的1024限制(select真的受1024限制吗?不!)

    很多很多年前,我被面试 为什么select调用最多只支持1024个文件描述符? 我没有答出来,我甚至不知道select到底是干什么的. 又过了很多年,我用这个问题面试了别人- 在当时,我心里已经有了会 ...

  6. linux IO模式及select、epoll、select详解(附示例)

    1 概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保 ...

  7. mysql select表达式_MySQL数据库SELECT查询表达式解析

    数据的管理在很大一部分是在进行查找工作,而SELECT占据了很大的一部分 SELECT select_expr [,select_expr...] [ FROM table_reference WHE ...

  8. CSS-解决苹果点击高亮、安卓select灰色背景(select下拉框在IOS中背景变黑、出现阴影问题)

    CSS-解决苹果点击高亮.安卓select灰色背景(select下拉框在IOS中背景变黑.出现阴影问题) 参考文章: (1)CSS-解决苹果点击高亮.安卓select灰色背景(select下拉框在IO ...

  9. select sqlite 唯一_SQLite Select 语句

    SQLite Select 语句 SQLite 的 SELECT 语句用于从 SQLite 数据库表中获取数据,以结果表的形式返回数据.这些结果表也被称为结果集. 语法 SQLite 的 SELECT ...

最新文章

  1. Scrapy框架中管道的使用
  2. 面霸篇:高频 Java 基础问题(核心卷一)
  3. Oracle创建表管理表
  4. 输入参数的数目不足_机器学习算法—KMEANS算法原理及阿里云PAI平台算法模块参数说明...
  5. MySQL删除同一个字段的多条记录
  6. JDK 12,合并的收集器和命名的挑战
  7. 逻辑SQL Server数据复制101
  8. LNMP详解(十五)——Nginx日志分析实战
  9. 尚硅谷JavaWeb视频教程,新版升级
  10. 跟着Nature Communications学作图--渐变火山图
  11. 局计算机房制度,岳阳市统计局机房管理制度
  12. NPS - 数字化营销 - 净推荐值
  13. 查看nvidia gpu共享内存大小
  14. 清华本科结业生两年的工作经历-献给游走在黑暗里的清华人
  15. 年度案例大数据盘点之Spark篇
  16. Julia·Pluto·Plots报错解决方法
  17. rfm模型python_使用python实现RFM模型
  18. java防止注册刷短信攻击_java面试(1)如何防止恶意攻击短信验证码接口
  19. reactive和ref的特性和区别
  20. 计算机视觉摔倒检测,有关摔倒检测数据集(fall detection databases)

热门文章

  1. 仿拉钩app(一)---爬虫数据准备
  2. 非root用户ssh 执行 sudo远程机器免密钥
  3. 聊聊全站HTTPS带来的技术挑战
  4. HDS:聚焦未来的投资“冻结”
  5. 如何快速精确的和leader沟通
  6. 系统起动时加载的过程
  7. js优化工具:ECMAScript Cruncher
  8. 深入解读ESB与SOA的关系
  9. raidrive安装失败_记一次RaiDrive映射OneDrive遇到的问题
  10. jsp超链接到java文件,jsp页面超链接传中文终极解决办法