一、概述

并发的网络编程中不管是阻塞式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. centos7内网源站建设

    centos7内网源站建设 1.部署环境: 系统:Centos7 x86_64 应用服务:nginx.createrepo.reposync 镜像源:https://mirrors.aliyun.co ...

  2. 在项目中迁移MS SQLServer到Mysql数据库,实现MySQL数据库的快速整合

    在开发项目的时候,往往碰到的不同的需求情况,兼容不同类型的数据库是我们项目以不变应万变的举措之一,在底层能够兼容多种数据库会使得我们开发不同类型的项目得心应手,如果配合快速的框架支持,那更是锦上添花的 ...

  3. DOTween 相关API效果

    1,首先看一遍完整Tween路径 2,操作 DoPlay->DoRestart,DoRestart是从调用时刻重新开始开始执行Tween 3,操作 DoPlay->DoReWind,DoR ...

  4. vue.js实战——$event

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. final关键字总结

    参考文章[https://www.cnblogs.com/xrq730/p/4820296.html] 前言:在Java中final作为最常见的一个关键字,平常用到的地方也很多,接下来就来看看什么是f ...

  6. pci设备驱动相关

    pci 设备注册及查找: https://www.cnblogs.com/image-eye/archive/2012/02/15/2352912.html PFN https://nieyong.g ...

  7. 对Datatable中过长内容实行省略话

    , 16) + '...</a>' } // 点击跳转的实现 else { return '<a id="taskFocus" href="/task_ ...

  8. ThreadPoolExecutor 中的 shutdown() 、awaitTermination() 、 shutdownNow() 的用法

    shutdown和awaitTermination为接口ExecutorService定义的两个方法,一般情况配合使用来关闭线程池. 方法简介shutdown方法:将线程池状态置为SHUTDOWN.平 ...

  9. 支付宝支付demo(亲测)

    支付宝支付demo 这个是java后台调起支付的demo,直接将body返回给安卓端即可调起支付 package com.dyy.test; import java.text.SimpleDateFo ...

  10. python 高阶函数之 map

    以例子来理解 用法1:如函数 f(x) = x * x,用python实现如下 >>> def f(x): ... return x * x >>> r = map ...