前言

在看过前文:初探IO复用后,想必你已对IO复用这个概念有了初步但清晰的认识。

接下来,我要在一个具体的并发客户端中实现它(基于select函数),使得一旦服务器中的客户进程被终止的时候,客户端这边立即得到通知并返回异常。

select函数

函数原型:int select ( int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout )

包含头文件:sys/select.h  sys/time.h ( 两个都要包含 )

参数说明:maxfdp1表示监听描述符个数( 一般直接赋予最大描述符号的值+1 ),中间几个参数表示具体的监听描述符集( 读/写/异常描述符集,本质是位向量组 ),最后一个参数表示监听的时间限制结构体。

配套使用宏:

1. void FD_ZERO ( fd_set *fdset ) 监听描述符集清零

2. void FD_SET ( int fd, fd_set *fset ) 注册要监听的描述符

3. void FD_CLR ( int fd, fd_set *fdset ) 注销不要监听的描述符

4. int FD_ISSET ( int fd, fd_set *fdset ) 判断某个监听信号是否接收到( 一般用于在select函数调用后某个信号是否接收到判断 )

返回值:返回已经就绪的描述符的个数,如果是定时器到时则返回0,出错则返回-1。

大致用法:

1. 定义一个空的描述符集

以下部分循环:

2. 注册要监听的描述符

3. 调用select函数

4. 依次编写IO处理代码( 一般是if ( FD_ISSET(描述符), &监听描述符集 ) { } 这样的结构 )。

代码实现

下面的代码对之前的客户端代码做了修改,增加了基于select函数的IO复用机制:

  1. #include "unp.h"
  2.  
  3. void
  4. str_cli(FILE *fp, int sockfd)
  5. {
  6. int maxfdp1;
  7. // 定义描述符集
  8. fd_set rset;
  9. char sendline[MAXLINE], recvline[MAXLINE];
  10.  
  11. // 清空描述符集
  12. FD_ZERO(&rset);
  13. for ( ; ; ) {
  14. // 注册要监听的两个描述符
  15. FD_SET(fileno(fp), &rset);
  16. FD_SET(sockfd, &rset);
  17. // 计算最大描述符并将它+1后作为select函数的第一个参数
  18. maxfdp1 = max(fileno(fp), sockfd) + ;
  19. // 调用并阻塞于select函数
  20. Select(maxfdp1, &rset, NULL, NULL, NULL);
  21.  
  22. // 读取回射以及处理TCP分节
  23. if (FD_ISSET(sockfd, &rset)) {
  24. if (Readline(sockfd, recvline, MAXLINE) == )
  25. err_quit("str_cli: server terminated prematurely");
  26. Fputs(recvline, stdout);
  27. }
  28.  
  29. // 处理用户输入
  30. if (FD_ISSET(fileno(fp), &rset)) {
  31. if (Fgets(sendline, MAXLINE, fp) == NULL)
  32. return;
  33. Writen(sockfd, sendline, strlen(sendline));
  34. }
  35. }
  36. }

运行测试

经过测试,发现当服务器杀死客户端子进程后,客户端这边立刻报错并退出了程序。

第十七篇:IO复用之select实现的更多相关文章

  1. 【Unix网络编程】chapter6 IO复用:select和poll函数

    chapter6 6.1 概述 I/O复用典型使用在下列网络应用场合. (1):当客户处理多个描述符时,必须使用IO复用 (2):一个客户同时处理多个套接字是可能的,不过不叫少见. (3):如果一个T ...

  2. IO复用之select实现

    前言 在看过前文:初探IO复用后,想必你已对IO复用这个概念有了初步但清晰的认识.接下来,我要在一个具体的并发客户端中实现它( 基于select函数 ),使得一旦服务器中的客户进程被终止的时候,客户端 ...

  3. linux的IO复用,select机制理解--ongoing

    一:首先需要搞清楚IO复用.阻塞的概念: Ref:  https://blog.csdn.net/u010366748/article/details/50944516 二:select机制 作为IO ...

  4. IO复用: select 和poll 到epoll

    linux 提供了select.poll和epoll三种接口来实现多路IO复用.下面总结下这三种接口. select 该函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或经 ...

  5. 网络编程之IO复用:select or epoll

    对于服务器的并发处理能力,我们需要的是:每一毫秒服务器都能及时处理这一毫秒内收到的数百个不同TCP连接上的报文,与此同时,可能服务器上还有数以十万计的最近几秒没有收发任何报文的相对不活跃连接.同时处理 ...

  6. 多路IO复用模型--select, poll, epoll

    select 1.select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数 2.解决1024以下客户端时使用se ...

  7. 6. IO复用:select 和 poll

    select #include <sys/select.h> #include <sys/time.h> int select(int maxfdp1, fd_set *rea ...

  8. IO复用与select函数

    socket select函数的详细讲解 select函数详细用法解析      http://blog.chinaunix.net/uid-21411227-id-1826874.html linu ...

  9. 第十六篇:初探IO复用

    前言 在之前的文章中,我具体实现了一个并发回射服务器并给它加载了僵尸子进程的自动清理信号机制.在正常情况下,它已经可以很好地工作了,但它能否合理应对一些特殊情况呢? 问题发现 先来看看当服务器的客户子 ...

随机推荐

  1. QVariant类及QVariant与自定义数据类型转换的方法

    这个类型相当于是Java里面的Object,它把绝大多数Qt提供的数据类型都封装起来,起到一个数据类型“擦除”的作用.比如我们的 table单元格可以是string,也可以是int,也可以是一个颜色值 ...

  2. Socket心跳包机制

    心跳包的发送,通常有两种技术方法1:应用层自己实现的心跳包 由应用程序自己发送心跳包来检测连接是否正常,大致的方法是:服务器在一个 Timer事件中定时 向客户端发送一个短小精悍的数据包,然后启动一个 ...

  3. vb.net与c#相互转换工具

    vb.net与c#相互转换工具:  http://www.developerfusion.co.uk/utilities/convertvbtocsharp.aspx http://www.dotne ...

  4. 解决maven jmxtools 缺失的问题

    原因:有版权,所以maven仓库基本都下架了jmxtool. 目前可用的,我就找到了wso2这家,配置如下: <project xmlns="http://maven.apache.o ...

  5. Response.Redirect与Server.Transfer区别-转

    执行过程: 1.浏览器ASP文件请求->服务器执行->遇到response.redirect语句->服务器发送response.redirect后面的地址给客户机端的浏览器-> ...

  6. 嵌入式开发之uart---rs232 和rs485 通用自定义通信协议

    http://www.go-gddq.com/html/QiTa-ZongHe_tx/2013-01/992622.htm http://blog.csdn.net/niuxuheng/article ...

  7. Linux下yum命令详解

    yum是什么yum = Yellow dog Updater, Modified主要功能是更方便的添加/删除/更新RPM包.它能自动解决包的倚赖性问题.它能便于管理大量系统的更新问题yum特点 可以同 ...

  8. windows server 安装phpVirtualBox web服务

    这是我在Windows server 2012 下的安装过程 (1) 安装virtualbox (2) 安装IIS和PHP, 参考: https://msdn.microsoft.com/zh-cn/ ...

  9. JS jQuery json日期格式问题的办法

    原生JS:Date对象详细参考 Date对象:基于1970年1月1日(世界标准时间)起的毫秒数 本文参考MDN做的详细整理,方便大家参考MDN 构造函数: new Date(); 依据系统设置的当前时 ...

  10. RTC教程

    Tutorial: Get started with Rational Team Concert Getting Started with Jazz Source Control RTC入门教程及冲突 ...