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. Scheme、Claim、ClaimsIdentity、ClaimsPrincipal介绍

    在 token 创建.校验的整个生命周期中,都涉及到了  Scheme.Claim.ClaimsIdentity.ClaimsPrincipal 这些概念,如果你之前有使用过微软的 Identity ...

  2. css----单行文本超出部分显示省略号

    width: 300px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis;

  3. ZROI 暑期高端峰会 A班 Day3 图论

    最短路 NOI2019 D2T1 弹跳 KD 树 线段树套set -> 线段树套并查集? POI2014/2015 ??? \(n\) 个点 \(m\) 条边 DAG.求删掉每个点后 \(1\) ...

  4. ubuntu容器化开发系统配置 相关下载地址(laravel)

    ubuntu64位 18.04(开发使用桌面版本) Nginx PHP7.3 开发工具:PHPStorm 其他技术栈:laravel.VUE.NodeJs https://laravel.com/ h ...

  5. C语言-memset()

    1. memset()函数原型是extern void *memset(void *buffer, int c, int count)        buffer:为指针或是数组, c:是赋给buff ...

  6. [原创]Emmagee V2.4工具使用介绍

    [原创]Emmagee V2.4工具使用介绍 1 Emmagee 介绍 Emmagee 是网易杭州研究院 QA团队开发的一款简单易上手的Android性能监控App,主要用于监控单个App的CPU.内 ...

  7. android webview 全屏100%显示图片

    这里引用 第三方类库 implementation 'org.jsoup:jsoup:1.10.2' 定义工具类 HtmlUtils import org.jsoup.Jsoup; import or ...

  8. c# MongoDB分页辅助类,支持多条件查询

    创建一个获取MongoDB数据库实例的类 public class Db { private static IMongoDatabase db = null; private static reado ...

  9. 利用ffmpeg获取视频帧

    如果要对视频帧进行处理,可以先把视频帧读取出来. sh文件代码如下: #!/usr/bin/env sh VIDEO=/home/xxx/video/ FRAMES=/home/xxx/frame/ ...

  10. kafka作为elk缓存使用

    ELK集群在大规模的日志收集中面临着数据量大,收集不及时,或宕机的风险,可以选择单节点的redis,但是相比redis,kafka集群高可用的特性,更优,下面来配置kafka集群配置elk作为缓存的方 ...