网络编程中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. 布尔模型 如要检索"布尔检索"或"概率检索"但不包括"向量检索"方面的文档,其相应的查 ...
随机推荐
- Django rest framework(6)----序列化(2)
为什么要序列化 django 查询数据库返回的类型是 queryset 类型 而我们和前端通信使用的大多数是json类型,这个时候我们需要把 queryset的数据类型转换成python的数据类型然 ...
- NOIP2000提高组复赛C 单词接龙
题目链接:https://ac.nowcoder.com/acm/contest/248/C 题目大意: 略 分析: 注意点:1.前缀和后缀的公共部分应该选最短的.2.如果两个字符串前缀和后缀的公共部 ...
- Windows下Redis的安装和部署
Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久 ...
- mysql ssh 跳板机(堡垒机???)连接服务器
跳板机(Jump Server),也称堡垒机,是一类可作为跳板批量操作远程设备的网络设备,是系统管理员或运维人员常用的操作平台之一. 正常的登录流程 使用ssh命令登录跳板机: 登录跳板机成功后,在跳 ...
- java String转int int转化为String
String转int String str = "123"; int a = Integer.parseInt(str); System.out.println(a); Integ ...
- Excel将一列数据变为两列
如下表可将第一列分散到第二列和第三列 A B C 1 =OFFSET($A$1,(ROW(A1)-1)*2+COLUMN(A1)-1,) &"" =OFFSET($A$2, ...
- beego框架返回json数据
一.routers路由 package routers import ( "mybeego/controllers" "github.com/astaxie/beego& ...
- Access-Control-Allow-Origin跨域请求处理
今天在看新项目的时候,发现很多的 Controller 中都有一个 response.setHeader("Access-Control-Allow-Origin"," ...
- docker的基础命令
详细命令参考http://www.runoob.com/docker/docker-command-manual.html
- python中的三元运算
一.三元运算符 三元运算符就是在赋值变量的时候,可以直接加判断,然后赋值 格式:[on_true] if [expression] else [on_false] res = 值1 if 条件 els ...