select的列子说明select内部实现原理
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内部实现原理相关推荐
- 前端必读:浏览器内部工作原理
前端必读:浏览器内部工作原理 作者: Tali Garsiel 发布时间: 2012-02-09 14:32 阅读: 2133 次 原文链接 全屏阅读 [收藏] http://kb.c ...
- WEB HTTP:浏览器HTTP协议漫谈、请求对象Httprequest、响应对象HttpResponse、浏览器内部工作原理(待完善)
0 系列目录 WEB请求处理 WEB请求处理一:浏览器请求发起处理 WEB请求处理二:Nginx请求反向代理 WEB请求处理三:Servlet容器请求处理 WEB请求处理四:Tomcat配置实践 WE ...
- SQL Server中SELECT会真的阻塞SELECT吗?
在SQL Server中,我们知道一个SELECT语句执行过程中只会申请一些意向共享锁(IS) 与共享锁(S), 例如我使用SQL Profile跟踪会话86执行SELECT * FROM dbo.T ...
- mysql select符合查询_MySQL SELECT 联合查询
这里主要分享一下联合查询的用法. MySQL使用UNION和UNION ALL实现数据的联合查询. 假设有以下两个表: mysql>select * from staff; +----+---- ...
- 彻底解释Linux select的1024限制(select真的受1024限制吗?不!)
很多很多年前,我被面试 为什么select调用最多只支持1024个文件描述符? 我没有答出来,我甚至不知道select到底是干什么的. 又过了很多年,我用这个问题面试了别人- 在当时,我心里已经有了会 ...
- linux IO模式及select、epoll、select详解(附示例)
1 概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保 ...
- mysql select表达式_MySQL数据库SELECT查询表达式解析
数据的管理在很大一部分是在进行查找工作,而SELECT占据了很大的一部分 SELECT select_expr [,select_expr...] [ FROM table_reference WHE ...
- CSS-解决苹果点击高亮、安卓select灰色背景(select下拉框在IOS中背景变黑、出现阴影问题)
CSS-解决苹果点击高亮.安卓select灰色背景(select下拉框在IOS中背景变黑.出现阴影问题) 参考文章: (1)CSS-解决苹果点击高亮.安卓select灰色背景(select下拉框在IO ...
- select sqlite 唯一_SQLite Select 语句
SQLite Select 语句 SQLite 的 SELECT 语句用于从 SQLite 数据库表中获取数据,以结果表的形式返回数据.这些结果表也被称为结果集. 语法 SQLite 的 SELECT ...
最新文章
- Scrapy框架中管道的使用
- 面霸篇:高频 Java 基础问题(核心卷一)
- Oracle创建表管理表
- 输入参数的数目不足_机器学习算法—KMEANS算法原理及阿里云PAI平台算法模块参数说明...
- MySQL删除同一个字段的多条记录
- JDK 12,合并的收集器和命名的挑战
- 逻辑SQL Server数据复制101
- LNMP详解(十五)——Nginx日志分析实战
- 尚硅谷JavaWeb视频教程,新版升级
- 跟着Nature Communications学作图--渐变火山图
- 局计算机房制度,岳阳市统计局机房管理制度
- NPS - 数字化营销 - 净推荐值
- 查看nvidia gpu共享内存大小
- 清华本科结业生两年的工作经历-献给游走在黑暗里的清华人
- 年度案例大数据盘点之Spark篇
- Julia·Pluto·Plots报错解决方法
- rfm模型python_使用python实现RFM模型
- java防止注册刷短信攻击_java面试(1)如何防止恶意攻击短信验证码接口
- reactive和ref的特性和区别
- 计算机视觉摔倒检测,有关摔倒检测数据集(fall detection databases)