select用法 多并发处理
select默认最大检查套接口数量是1024,有定义
#define __NFDBITS (8 * sizeof(unsigned long))
#define __FD_SETSIZE 1024
#define __FDSET_LONGS (__FD_SETSIZE/__NFDBITS)
typedef struct {
unsigned long fds_bits [__FDSET_LONGS]; //1024
} __kernel_fd_set
1. 理解select
1.假设fd_set长度1字节
2.FD_ZERO(&set)。set = 0000 0000
3.fd = 3,FD_SET(fd, &set)。set = 0000 0100
4.fd = 6,FD_SET(fd, &set)。set = 0010 0100
4.执行select(fd + 1, &set, NULL, NULL, &tv)阻塞等待
5.若fd = 3可读,则select返回。set = 0000 0100(其他的fd被清空)
2. select
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
readfds:select监视的可读文件句柄集合
writefds:select监视的可写文件句柄集合
exceptfds:select监视的异常文件句柄集合
timeout:本次select()的超时结束时间 (见/usr/sys/select.h)
当readfds或writefds中映象的文件可读或可写或超时,本次select() 就结束返回
select不断修改timeout的值,进入下一次阻塞时,需要重新设置timeout时间
3. FD_CLR
void FD_CLR(int fd, fd_set *set);
从集合set中删除描述字fd
4. FD_ISSET
int FD_ISSET(int fd, fd_set *set);
测试fd是否是集合set中一员
5. FD_SET
void FD_SET(int fd, fd_set *set);
向集合set添加描述字fd
6. FD_ZERO
void FD_ZERO(fd_set *set);
将set初始化为空集NULL
7. 举例
while(1)
{
struct timeval tv; //根据需要
fd_set readfds;
FD_ZERO(&readfds); //每次必须清空
FD_SET(sock, &readfds); //设置的套接字必须是存在的,不然select报错
result = select(FD_SETSIZE, &readfds, NULL, NULL, &tv);
if (result < 0)
{
if (errno != EINTR)
{
fprintf(stderr, "Error in select(): %d %s\r\n", errno, strerror(errno));
}
}
else if (result > 0)
{
unsigned char buffer[MAX_PACKET_SIZE];
int numBytes;
if (FD_ISSET(sock, &readfds))
{
struct sockaddr_storage addr;
socklen_t addrLen;
addrLen = sizeof(addr);
numBytes = recvfrom(sock, buffer, MAX_PACKET_SIZE, 0, (struct sockaddr *)&addr, &addrLen);
}
}
}
select用法 多并发处理的更多相关文章
- html select用法总结
本文将介绍select 原生的常用方法,这些都是经过测试,兼容ie6到ie10,及chrome,火狐等,也就是说大部分浏览器都兼容.如果大家发现有不兼容的情况,可以跟我留言. 我们对基本的用法了如指掌 ...
- 网络通信 --> select()用法
select()用法 头文件 #include <sys/time.h> #include <sys/types.h> #include <unistd.h> 定义 ...
- python+selenium七:下拉框、选项框、select用法
# from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChainsimpo ...
- golang学习之select用法
早期的select函数是用来监控一系列的文件句柄,一旦其中一个文件句柄发生IO操作,该select调用就会被返回.golang在语言级别直接支持select,用于处理异步IO问题. select用法同 ...
- 数据库Oracle的select用法(部分)
Oracle的select用法(部分): 1.查询所有: select * from employees; 2.加上where子句:用选择限制行 select * from employees whe ...
- 每天玩转3分钟 MyBatis-Plus - 6. select 用法
每天玩转3分钟 MyBatis-Plus - 1. 配置环境 每天玩转3分钟 MyBatis-Plus - 2. 普通查询 每天玩转3分钟 MyBatis-Plus - 3. 高级查询(一) 每天玩转 ...
- select用法&原理详解(源码剖析)(转)
今天遇到了在select()前后fd_set的变化问题,查了好久终于找到一个有用的帖子了,很赞,很详细!!原文链接如下: select用法&原理详解(源码剖析) 我的问题是: 如下图示:在se ...
- select用法
每一次操作select的时候,总是要出来翻一下资料,不如自己总结一下,以后就翻这里了. 比如<select class="selector"></select&g ...
- shell编程中的select用法
select 语句 select表达式是bash的一种扩展应用,擅长于交互式场合.用户可以从一组不同的值中进行选择: select var in ... ; do break; done .... n ...
随机推荐
- 网络协议 19 - RPC协议综述
这几年微服务很火,想必各位博友或多或少的都接触过.微服务概念中, 各服务间的相互调用是不可或缺的一环.你知道微服务之间是通过什么方式相互调用的吗? 你可能说,这还不简单,用 socket 呗. ...
- C语言博客作业4——数组
0.展示PTA总分 一维数组 二维数组 字符数组 1.本章学习总结 1.1学习内容总结 一维数组知识点: 无论是对一维数组还是二维数组进行应用时,我们对其下标的应用十分广泛. 1:一维数组的输入和遍历 ...
- PyCharmIDE: 给脚本传递参数
- prometheus安装(docker)
参考:https://github.com/songjiayang/prometheus_practice https://github.com/kjanshair/docker-prometheus ...
- Linux 系统开机时间及当前时间
最近一次系统开机时间:date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M ...
- c#比较器辅助类
/// <summary> /// 比较器帮助类 /// 创建人:苏本东 :: /// </summary> public class ComparerHelper<T& ...
- SVN与GIT工具使用对比
版本工具 差异 svn git 系统特点 1.集中式版本控制系统(文档管理很方便) 2.企业内部并行集中开发 3.windows系统上开发推荐使用 4.克隆一个拥有将近一万个提交(commit),五个 ...
- Android的开机启动流程
1.Android的开机启动流程 Android的层次框架图,如下所示: 图片清晰地展示了Android的五层架构,从上到下依次是:应用层.应用框架层.库层.运行时层以及Linux内核层.Androi ...
- 正则表达式之re模块
re模块一.什么是正则表达式与re模块?1.1 字符组1.2 元字符1.2.1 单个使用1.2.2 组合使用二.为什么要使用正则三.如何使用3.1 re模块的三种比较重要的方法3.1.1 findal ...
- Windows下安装 Linux 下vim编辑器
Windows下安装vim编辑器 下载传送门 https://vim.en.softonic.com/download# 开始安装 这是下载后的可执行文件 双击(或单击)运行软件,选择同意继续进行安装 ...