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用法 多并发处理的更多相关文章

  1. html select用法总结

    本文将介绍select 原生的常用方法,这些都是经过测试,兼容ie6到ie10,及chrome,火狐等,也就是说大部分浏览器都兼容.如果大家发现有不兼容的情况,可以跟我留言. 我们对基本的用法了如指掌 ...

  2. 网络通信 --> select()用法

    select()用法 头文件 #include <sys/time.h> #include <sys/types.h> #include <unistd.h> 定义 ...

  3. python+selenium七:下拉框、选项框、select用法

    # from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChainsimpo ...

  4. golang学习之select用法

    早期的select函数是用来监控一系列的文件句柄,一旦其中一个文件句柄发生IO操作,该select调用就会被返回.golang在语言级别直接支持select,用于处理异步IO问题. select用法同 ...

  5. 数据库Oracle的select用法(部分)

    Oracle的select用法(部分): 1.查询所有: select * from employees; 2.加上where子句:用选择限制行 select * from employees whe ...

  6. 每天玩转3分钟 MyBatis-Plus - 6. select 用法

    每天玩转3分钟 MyBatis-Plus - 1. 配置环境 每天玩转3分钟 MyBatis-Plus - 2. 普通查询 每天玩转3分钟 MyBatis-Plus - 3. 高级查询(一) 每天玩转 ...

  7. select用法&原理详解(源码剖析)(转)

    今天遇到了在select()前后fd_set的变化问题,查了好久终于找到一个有用的帖子了,很赞,很详细!!原文链接如下: select用法&原理详解(源码剖析) 我的问题是: 如下图示:在se ...

  8. select用法

    每一次操作select的时候,总是要出来翻一下资料,不如自己总结一下,以后就翻这里了. 比如<select class="selector"></select&g ...

  9. shell编程中的select用法

    select 语句 select表达式是bash的一种扩展应用,擅长于交互式场合.用户可以从一组不同的值中进行选择: select var in ... ; do break; done .... n ...

随机推荐

  1. 网络协议 19 - RPC协议综述

    这几年微服务很火,想必各位博友或多或少的都接触过.微服务概念中, 各服务间的相互调用是不可或缺的一环.你知道微服务之间是通过什么方式相互调用的吗?     你可能说,这还不简单,用 socket 呗. ...

  2. C语言博客作业4——数组

    0.展示PTA总分 一维数组 二维数组 字符数组 1.本章学习总结 1.1学习内容总结 一维数组知识点: 无论是对一维数组还是二维数组进行应用时,我们对其下标的应用十分广泛. 1:一维数组的输入和遍历 ...

  3. PyCharmIDE: 给脚本传递参数

  4. prometheus安装(docker)

    参考:https://github.com/songjiayang/prometheus_practice https://github.com/kjanshair/docker-prometheus ...

  5. Linux 系统开机时间及当前时间

    最近一次系统开机时间:date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M ...

  6. c#比较器辅助类

    /// <summary> /// 比较器帮助类 /// 创建人:苏本东 :: /// </summary> public class ComparerHelper<T& ...

  7. SVN与GIT工具使用对比

    版本工具 差异 svn git 系统特点 1.集中式版本控制系统(文档管理很方便) 2.企业内部并行集中开发 3.windows系统上开发推荐使用 4.克隆一个拥有将近一万个提交(commit),五个 ...

  8. Android的开机启动流程

    1.Android的开机启动流程 Android的层次框架图,如下所示: 图片清晰地展示了Android的五层架构,从上到下依次是:应用层.应用框架层.库层.运行时层以及Linux内核层.Androi ...

  9. 正则表达式之re模块

    re模块一.什么是正则表达式与re模块?1.1 字符组1.2 元字符1.2.1 单个使用1.2.2 组合使用二.为什么要使用正则三.如何使用3.1 re模块的三种比较重要的方法3.1.1 findal ...

  10. Windows下安装 Linux 下vim编辑器

    Windows下安装vim编辑器 下载传送门 https://vim.en.softonic.com/download# 开始安装 这是下载后的可执行文件 双击(或单击)运行软件,选择同意继续进行安装 ...