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 ...
 
随机推荐
- Windows空间清理2
			
最近听说有同事因为电脑C盘不足,让别人重装电脑解决了,感觉有点意料之外又有点情理之中. 一方面居然有某些做技术的同事不知道要如何高效的清理自己的磁盘空间,要花一天时间重装系统.然后装软件.再配置各种开 ...
 - django -- ORM实现图书增删改查
			
表结构设计 上篇我们实现了出版社的增删改查,出版社数据表有两个字段id和name,那图书的表结构怎么设计呢?图书也要有一个主键id,还要有一个名称title,是哪个出版社的,要有个字段press和Pr ...
 - cocos:C++ 导出到lua, genbindings.py修改
			
cocos:C++ 导出到lua, genbindings.py修改 1. 准备 把tools目录下的cocos2dx_extension.ini, genbindings.py, userconf. ...
 - LEDE安装zerotier 无法启动解决方法
			
进入命令行模式,vi /etc/config/zerotier文件,把option enabled '0'的0改为1.
 - 【p6spy学习之一】p6spy使用
			
一.介绍 p6spy是一个开源项目,通常使用它来跟踪数据库操作,查看程序运行过程中执行的sql语句.1.原理 p6spy将应用的数据源给劫持了,应用操作数据库其实在调用p6spy的数据源,p6spy劫 ...
 - webstorm创建js文件时自动生成js注释
			
设置webstorm创建js文件时自动生成js注释 settings--Editor--File and Code Temlates 黑色框框里的内容自己填写上去,以下是参考的代码块: /** * @ ...
 - Python3第三方组件最新版本追踪实现
			
一.说明 在安全基线中有一项要求就是注意软件版本是否是最新版本,检查是否是最新版本有两方面的工作一是查看当前使用的软件版本二是当前使用软件的最新版本.在之前的“安全基线自动化扫描.生成报告.加固的实现 ...
 - dockerfile 命令
			
FROM 功能为指定基础镜像,并且必须是第一条指令. 如果不以任何镜像为基础,那么写法为:FROM scratch. 同时意味着接下来所写的指令将作为镜像的第一层开始 语法: FROM <ima ...
 - AntDesign vue学习笔记(六)Table 显示图片
			
AntDeign官网上没有table动态绑定显示图片的示例,baidu上搜索出来的大部分都是React语法,无法使用. 经过摸索,实现方法如下:以显示一个图片,一个按钮为例(picurl是返回的jso ...
 - SpringApplication常见用法说明
			
启动方式 方式1:在main方法中执行SpringApplication.run()这种方式来启动我们的工程 // 方式一 @SpringBootApplication public class Ap ...