一、概述

并发的网络编程中不管是阻塞式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)的更多相关文章

  1. 并发编程:Actors 模型和 CSP 模型

    https://mp.weixin.qq.com/s/emB99CtEVXS4p6tRjJ2xww 并发编程:Actors 模型和 CSP 模型 ImportNew 2017-04-27    

  2. Unix网络编程中的五种I/O模型_转

    转自:Unix网络编程中的的五种I/O模型 下面主要是把unp第六章介绍的五种I/O模型. 1. 阻塞I/O模型 例如UDP函数recvfrom的内核到应用层.应用层到内核的调用过程是这样的:首先把描 ...

  3. 浅谈TCP/IP网络编程中socket的行为

    我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) 2. Socket I/O系统 ...

  4. Java网络编程中异步编程的理解

    目录 前言 一.异步,同步,阻塞和非阻塞的理解 二.异步编程从用户层面和框架层面不同角度的理解 用户角度的理解 框架角度的理解 三.为什么使用异步 四.理解这些能在实际中的应用 六.困惑 参考文章 前 ...

  5. 网络编程中的read,write函数

    关于TCP/IP协议,建议参考Richard Stevens的<TCP/IP Illustrated,vol1>(TCP/IP详解卷1). 关于第二层面,依然建议Richard Steve ...

  6. Linux网络编程——tcp并发服务器(poll实现)

    想详细彻底地了解poll或看懂下面的代码请参考<Linux网络编程——I/O复用之poll函数> 代码: #include <string.h> #include <st ...

  7. 贫血模型和DDD模型

    贫血模型和DDD模型 1.贫血模型 1.1 概念 常见的mvc三层架构 简单.没有行为 2.领域驱动设计 2.1 概念(2004年提出的) Domain Driven Design 简称 DDD DD ...

  8. 复杂领域的Cynefin模型和Stacey模型

    最近好奇“复杂系统”,收集了点资料,本文关于Cynefin模型和Stacey模型.图文转自互联网后稍做修改. Cynefin模型提供一个从因果关系复杂情度来分析当前情况而作决定的框架,提出有五个领域: ...

  9. 文本信息检索——布尔模型和TF-IDF模型

    文本信息检索--布尔模型和TF-IDF模型 1. 布尔模型 ​ 如要检索"布尔检索"或"概率检索"但不包括"向量检索"方面的文档,其相应的查 ...

随机推荐

  1. HRBUST - 2069-萌萌哒十五酱的衣服~-multiset-lower_bound

    众所周知,十五酱有很多的衣服,而且十五酱东西收拾的非常糟糕. 所以十五酱经常找不到合适的衣服穿,于是她觉得收拾一下屋子,把衣服配成一套一套的~(即一件衬衫一件裤子. 十五酱一共有n件衣服,有衬衫有裤子 ...

  2. 【转】详解springboot-修改内置tomcat版本

    1.解析Spring Boot父级依赖 <parent> <groupId>org.springframework.boot</groupId> <artif ...

  3. HIT创业感言:只有长寿的企业才有持续价值

    导语:本文将讨论医疗信息化行业中的创业和企业经营问题.笔者创立的南京都昌科技有限公司专做电子病历编辑器控件,已经有3年多,期间辛苦多年,但因为医疗信息化行业的整体发展良好,也能有所成就了,不过革命尚未 ...

  4. Django rest framework(8)---- 视图和渲染器

    django rest framework 之视图 序列化器    PagerSerialiser from rest_framework import serializers from api im ...

  5. JDK环境配置(Windows)

    JDK环境配置(Windows): 1.下载jdk版本: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads ...

  6. Java BitSet使用场景和示例

    一.什么是BitSet? 注:以下内容来自JDK API: BitSet类实现了一个按需增长的位向量.位Set的每一个组件都有一个boolean值.用非负的整数将BitSet的位编入索引.可以对每个编 ...

  7. Web App架构

    Web App 架构分为两种:一种是工程架构,一种是项目架构. 工程架构则主要有以下几个方面的内容: 1, 解放生产力,我们希望在开发项目的过程中把全部目光都放到书写业务代码上,不需要去考虑一些重复性 ...

  8. vue中@contextmenu在pc和mac中的区别

    项目中有用到右键菜单,故用了@contextmenu,由于本人是用的PC电脑,所以一切正常, 但是有同事用mac测试了一下,问题随之而来,MAC上右键按下就触发了, PC上面是鼠标抬起才会触发,所以这 ...

  9. BZOJ 3669 魔法森林

    LCT维护生成树 先按照a的权值把边排序,离线维护b的最小生成树. 将a排序后,依次动态加边,我们只需要关注b的值.要保证1-n花费最少,两点间的b值肯定是越小越好,所以我们可以考虑以b为关键字维护最 ...

  10. POJ 3974 Palindrome (算竞进阶习题)

    hash + 二分答案 数据范围肯定不能暴力,所以考虑哈希. 把前缀和后缀都哈希过之后,扫描一边字符串,对每个字符串二分枚举回文串长度,注意要分奇数和偶数 #include <iostream& ...