网络编程中select模型和poll模型学习(linux)
一、概述
并发的网络编程中不管是阻塞式IO还是非阻塞式IO,都不能很好的解决同时处理多个socket的问题。操作系统提供了复用IO模型:select和poll,帮助我们解决了这个问题。这两个函数都能够允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或者经历一段指定的时间后才唤醒它。
二、select模型
1、函数定义

2、函数解析
(1)maxfd1参数指定待测试的描述符的个数,它的值是所有待测试描述符中最大者加1,描述符0,1,2,...一直到maxfd1-1均被测试。(windows中该参数没有意义)
(2)fd_set是一个描述符集类型,通常是一个整数数组,数组中每个整数它们二进制形式中的每一位对应一个描述符的状态。详细参考:http://blog.csdn.net/pinhole/article/details/54575204
通过以下四个宏可以管理描述符

select模型中能够管理的描述符数量是有限制的,最多不能超过FD_SETSIZE,这个宏定义定义在<sys/select.h>头文件中。这个值虽然可以通过修改内核修改,但是会影响通信的效率。所以针对这个限制,操作系统提供了poll模型。
readset、writeset和exceptset分别设置我们对读、写和异常检测的描述符。不需要检测的条件可以将对应的描述符集置为空。这三个参数是值-结果参数,调用时,我们指定所关心的描述符的值,函数返回时,结果将指示哪些描述符已就绪(就绪的话描述符集对应二进制位为1)。
(3)timeout可以设置三个值:置为空,表示仅在有一个描述符准备好IO才返回,否则永远等下去;置为指定的秒数和微秒数,在有一个描述符准备好或者超时后,select返回;置为0,则select会检查完描述符后立即返回,相当于轮巡。
(4)返回值
该函数的返回值表示描述符集中满足条件的描述符个数。如果在任何描述符就绪前定时器到时,那么返回0。返回-1表示错误。
3、描述符就绪的条件
(1)满足下列四个条件中的任何一个,一个套接字准备好读
a)该套接字接收缓冲区中的数据字节数大于等于套接字接收缓冲区低水位标记
b)该连接的读半部关闭(也就是接受了FIN的TCP连接)
c)该套接字是一个监听套接字并且已完成的连接数不为0。接下来可以通过accept接收连接客户端套接字
d)有一个套接字错误待处理
(2)满足下列四个条件中的任何一个,一个套接字准备好写
a)该套接字发送缓冲区中的数据字节数大于等于套接字发送缓冲区低水位标记
b)该连接的写半部关闭
c)使用非阻塞式connect的套接字已建立连接,或者connect已经以失败告终
d)有一个套接字错误待处理
(3)如果一个套接字存在带外数据或者仍处于带外标记,那么它有异常条件待处理。
三、poll模型
1、函数定义

2、函数解析
(1)第一个参数是一个pollfd类型的数组,用于指定测试某个给定描述符fd的条件。

fd为要测试的描述符,events为要测试的条件,revents存放函数返回后该描述符的状态。和select函数中间的三个值-结果参数不同,poll将值和结果分开。events和revents由下列值按位或构成。

(2)nfds为第一个参数数组的个数。
(3)timeout参数指定poll函数返回前等待多长时间。为INFTIM(-1)表示永远等待,直到描述符满足相应的条件;为0表示立即返回,不阻塞;大于0表示等待指定的毫秒数或者描述符满足相应的条件。
(4)返回值
当发生错误时,poll函数返回-1;若定时器到时之前没有任何描述符满足条件,返回0;否则返回就绪描述符的个数,即revents成员值非0的描述符个数。
(5)如果我们不再关心某个描述符,那么可以把与它对应的pollfd数组的fd成员设置成一个负值。poll函数将忽略这样的pollfd结构的events成员,返回时将它的revents成员的值置为0。
实现代码:http://download.csdn.net/detail/pinhole/9738939
网络编程中select模型和poll模型学习(linux)的更多相关文章
- 并发编程:Actors 模型和 CSP 模型
https://mp.weixin.qq.com/s/emB99CtEVXS4p6tRjJ2xww 并发编程:Actors 模型和 CSP 模型 ImportNew 2017-04-27
- Unix网络编程中的五种I/O模型_转
转自:Unix网络编程中的的五种I/O模型 下面主要是把unp第六章介绍的五种I/O模型. 1. 阻塞I/O模型 例如UDP函数recvfrom的内核到应用层.应用层到内核的调用过程是这样的:首先把描 ...
- 浅谈TCP/IP网络编程中socket的行为
我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) 2. Socket I/O系统 ...
- Java网络编程中异步编程的理解
目录 前言 一.异步,同步,阻塞和非阻塞的理解 二.异步编程从用户层面和框架层面不同角度的理解 用户角度的理解 框架角度的理解 三.为什么使用异步 四.理解这些能在实际中的应用 六.困惑 参考文章 前 ...
- 网络编程中的read,write函数
关于TCP/IP协议,建议参考Richard Stevens的<TCP/IP Illustrated,vol1>(TCP/IP详解卷1). 关于第二层面,依然建议Richard Steve ...
- Linux网络编程——tcp并发服务器(poll实现)
想详细彻底地了解poll或看懂下面的代码请参考<Linux网络编程——I/O复用之poll函数> 代码: #include <string.h> #include <st ...
- 贫血模型和DDD模型
贫血模型和DDD模型 1.贫血模型 1.1 概念 常见的mvc三层架构 简单.没有行为 2.领域驱动设计 2.1 概念(2004年提出的) Domain Driven Design 简称 DDD DD ...
- 复杂领域的Cynefin模型和Stacey模型
最近好奇“复杂系统”,收集了点资料,本文关于Cynefin模型和Stacey模型.图文转自互联网后稍做修改. Cynefin模型提供一个从因果关系复杂情度来分析当前情况而作决定的框架,提出有五个领域: ...
- 文本信息检索——布尔模型和TF-IDF模型
文本信息检索--布尔模型和TF-IDF模型 1. 布尔模型 如要检索"布尔检索"或"概率检索"但不包括"向量检索"方面的文档,其相应的查 ...
随机推荐
- 深入理解 Java 基本数据类型
深入理解 Java 基本数据类型
- 好的LCT板子和一句话
typedef long long ll; const int maxn = 400050; struct lct { int ch[maxn][2], fa[maxn], w[maxn]; bool ...
- Flask 快速使用 —— (1)
Flask.Django.Tornado框架 区别 1 Django:重武器,内部包含了非常多组件:ORM.Form.ModelForm.缓存.Session.中间件.信号等... 2 Flas ...
- JVM调优:HotSpot JVM垃圾收集器
HotSpot JVM垃圾收集器 - Snooper - 博客园https://www.cnblogs.com/snooper/p/8718478.html
- 如何给框架添加API接口日志
前言 用的公司的框架,是MVC框架,看了下里面的日志基类,是操作日志,对增删改进行记录, 夸张的是一张业务的数据表 需要一张专门的日志表进行记录, 就是说你写个更新,添加的方法都必须写一遍操作日志,代 ...
- 二、IIS部署WebApi
一.项目发布 二.hosts 更改 C:\Windows\System32\drivers\etc 三.网站搭建 之后我将端口默认更改 8001 以防与80端口冲突 注意: 1.先测试IIS的lo ...
- Python——Flask框架
Flask框架相关知识构架 程序的基本结构 模板 Web表单 数据库 电子邮件 程序的结构 用户认证
- CentOS修改SSH端口号和禁止root用户直接登录
linux安装ssh远程登录后,为了安全起见,修改默认的22端口号并禁止root用户直接通过ssh登录. 配置方法如下: 1.使用vi编辑器打开ssh配置文件 /etc/ssh/sshd_config ...
- 一分钟学会JavaMail(假)__手动滑稽
因为公司内部办公系统(OA)需要增加一个发送邮件的功能,所以学习了这个感觉比较冷门的JavaMail 1.先上成功截图 : 2.准备事项:Java Mail虽然是官方写的,但是没有集成到jdk里面 ...
- 【CF1132G】Greedy Subsequences(线段树)
[CF1132G]Greedy Subsequences(线段树) 题面 CF 题解 首先发现选完一个数之后选择下一个数一定是确定的. 对于每个数预处理出左侧第一个比他大的数\(L\),那么这个数加入 ...