网络软件设计select.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
网络软件设计select

第七讲 多路通信与select() 阻塞与非阻塞机制 多路通信设计 什么叫多路通信/多路复用? 多条连接上的数据同时通信 什么叫“同时”? 同一时刻 并行 同一时间 并发:在一段时间内同时发生 一段时间究竟有多长? 通信领域:从通信的开始到通信的结束 从建立连接到关闭连接 多路通信设计 怎样同时通信? select() 功能设计: 该函数能检查多个套接字的状态,服务器程序就可以根据这些信息做出相应的处理 输入: 套接字队列 将希望多路操作的一组套接字排成队列 输出: 各待查套接字当前的状态 如:是否有数据到达,是否需要关闭等 Select()程序框架 多路复用的程序基本框架 多路复用程序设计关键技术 关键技术: 套接字队列 状态表示与处理 关键技术:套接字队列 1套接字队列 2套接字队列的操作 初始化、插入、删除、查找、遍历等 关键技术:套接字队列 套接字接口提供了一些专门的操作实现套接字队列的插入、删除和查找等功能 初始化 FD_ZERO( * set )--初始化套接字队列-set 插入 FD_SET( s, *set )--将套接字s插入到队列set中 删除 FD_CLR( s, *set )--从队列set中删除套接字s 查找 FD_ISSET(s, *set )--查找s是否在队列set中 多路复用程序设计关键技术 3、状态表示 用逐个标识方式--标志:为每个套接字设置标志位,表明所处状态 用分类处理方式--状态队列:具有某个状态的套接字进入到相应的状态队列中 多路复用程序设计关键技术 socket的状态不止这三种,有些状态在适当的时候利用三种基本状态的一种表现出来。 例如: 读状态 当套接字先前处于listen( ),读状态意味者在这个套接字上有了新的连接 写状态 当套接字先前处于connect( )--申请连接远端,写状态意味着与远方的连接已经建立 意外状态 当套接字先前处于connect( )--申请连接远端,其它状态意味着与远方的连接已经失败 事件驱动的机制 基于select的程序可以认为是具有事件驱动特点的机制 select可看作是事件发生器 得到事件后进行分发处理 事件驱动的机制 在select的事件中最重要的是: 接收数据事件--读事件 发送数据事件?--写事件 不是有发送事件了,才发送数据--即:不是看见电话可以用,我们就要打一通电话 而是:有发送数据的需要了,向系统询问是否可以发送数据,系统给出发送数据事件后,我们发送数据。 没有数据需要发送时,不会去关心套接字是否可以发送,即获得写事件 事件驱动的机制 发送观念的转变 事件驱动的机制 对比传统的做法 当发生系统发送速度慢,造成发送不能成功时,即不能阻塞等待,也不能不阻塞而使系统更加繁忙。 阻塞与非阻塞对程序设计的影响 网络软件设计中常遇到等待对方应答的现象 等,还是不等?--阻塞还是不阻塞? 这是个问题! 等 可能造成“等”此失彼--多路复用机制失效 不等! 容易形成“忙等”--浪费CPU资源 非阻塞流程 select的超时机制 timeout: 放入0 忙等 放入非零值 等待相应时间 放入空指针 完全阻塞 网络软件设计 阻塞与非阻塞机制 阻塞与非阻塞 阻塞 当要求的系统服务得到满足时才返回的调用 例:recv(s, buffer, ……); 当远端有数据送来时才“返回” 非阻塞: 无论系统服务是否能立即完成,系统调用都立即返回 例:recv(s, buffer, ……); 并不等到对方数据送来才返回,无论套接口的so_rev队列是否有数据,非阻塞的recv都将立刻返回 阻塞流程 阻塞与非阻塞的设置 系统在执行一个套接字函数时,如何知道是否应该阻塞? 根据套接字状态 阻塞态套接字 非阻塞态套接字 如何设置套接字状态? 在ioctlsocket()中设置 FIONBIO,指定套接字状态 阻塞与非阻塞的设置 例:设置套接字为阻塞态 例:设置套接字为非阻塞态 阻塞与非阻塞对程序设计的影响 网络软件设计中常遇到等待对方应答的现象 等,还是不等?--阻塞还是不阻塞? 这是个问题! 等 可能造成“等”此失彼--多路复用机制失效 不等! 容易形成“忙等”--浪费CPU资源 非阻塞流程 select的超时机制 timeout: 放入0 忙等 放入非零值 等待相应时间 放入空指针 完全阻塞 阻塞与非阻塞对程序设计的影响 1、程序执行效率和功能 阻塞 CPU利用率最高 程序不具备多路复用功能 非阻塞 会浪费CPU多做无谓的判断 程序可同时处理多个事件 阻塞与非阻塞对程序设计的影响 2、流程可能不同 阻塞: 非阻塞: 阻塞与非阻塞对程序设计的影响 3、事件处理方式可能不同 部分函数执行结果不同,如recv() 阻塞 返回值大于0:表示有数据

文档评论(0)

zilaiye + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档