【linux网络编程学习笔记】第七节:TCP select多路复用IO实现群聊功能(select  多路复用、FD_SET、FD_CLR 、FD_ZERO、FD_ISSET)

       The first wealth is health .(Ralph Waldo Emerson , American thinker)

  健康是人生第一财富。(美国思想家 爱默生。 R. W.)

TCP select多路复用IO复用实现群聊功能

为何需要多路复用

selent多路复用API

select  多路复用

设置文件描述符

select群聊功能实现

主要步骤

1、初始化要监控的文件描述符

2、判断是否有期望的事件发生

TCP服务器例程 tcp_server.c

TCP客户端例程 tcp_client.c


上一篇博客中写到如何利用线程实现群聊功能,本文就换一种实现机制——selent复用来监控多个文件描述符,点击跳转

为何需要多路复用

        在实际操作中往往需要操作多个设备文件,应用程序中同时处理多路输入输出流,若采用阻塞模式,将得不到预期的目的。举个栗子:一个程序需要同时监控鼠标和键盘,但不知道事件何时发生,调用的API又会阻塞,不能同时监控多个设备。

        若采用非阻塞模式,对多个输入进行轮询,但又太浪费CPU资源,若设置多个进程,分别处理一条数据通路,将新产生进程间的同步与通信问题,使程序变得更加复杂。

linux也提供了解决方法,使用I/O多路复用。其基本思想是:

  1. 先构造一张有关描述符的表,然后调用一个函数。当这些文件描述符中的一个或多个已准备好进行I/O时函数才返回。
  2. 函数返回时告诉进程那个描述符已就绪,可以进行I/O操作。

selent多路复用API

select  多路复用

 #include <sys/select.h>

/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

int select(int nfds, fd_set *readfds, fd_set *writefds,
          fd_set *exceptfds, struct timeval *timeout);

函数功能

  • 一次性监控多个文件描述符

参数:

  • nfds:要监控的文件描述符中最大的那个值+1
  • readfds:读文件描述符集合
  • writefds:写文件描述符集合
  • exceptfds:其他类文件描述符集合
  • timeout:规定我只在这里阻塞多长的时间,如果时间一到还没有文件描述符有反应我们select函数也不等待了,直接返回0
    • 超时设置.
    • Null:一直阻塞,直到有文件描述符就绪或出错
    • 时间值为0:仅仅检测文件描述符集的状态,然后立即返回
    • 时间值不为0:在指定时间内,如果没有事件发生,则超时返回。

返回值:

  • 成功返回发生事件文件的集合,超时返回0,错误返回-1

在我们调用select时进程会一直阻塞直

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值