09-SOCKET-IO复用技术.pptVIP

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

课后练习 完成一个群聊软件 服务器端负责转发数据包 客户端负责聊天内容输入和显示 功能: 昵称登录 群聊 私聊(可选) 文件传送(可选) 程序结构图 服务器SERVER 客户端信息区 数据包信息区 收进程 发/处理进程 客户端Client 输入输出进程 收发进程 消息队列 登录步骤 1.客户端第一次登陆服务器,要向服务器发送登录请求包(用户啊昵称,用户IP) 2服务器收到之后对客户端进行注册(把昵称和ip放进一个数组中增加一个为其产生的子进程编号. 然后把该数字写进共享内存, 最后通过遍历该数组获得每个进程编号发送信号。 每个子进程收到信号之后读取共享内存里面的数字获得昵称和对应IP,然后发送到相应的客户端中 群聊步骤 客户端发送群聊包,服务器子进程收到信息后,往共享内存中写入对方发的聊天信息和对方的昵称以及本进程id 然后跟客户端通讯的子进程发送kill(0,12),那么进程组所有成员都能获得信号,在信号处理函数内去读取共享内存内容 取出来后先比较下自己的进程id和共享内存里的pid是否一致。如果不一致就发送聊天内容 私聊步骤 客户端发送私聊包,包里面包含对方的昵称和ip 子进程收到私聊包后。同样也要把数据写进共享内存。发送信号给进程组。 每个子进程都会收信号,在信号处理函数内部,读取共享内存的时候判断包类型,然后如果是私聊包,再判断自己的进程是否是要私聊的子进程,如果是直接取出转发。如果不是丢弃不管 第九章 SOCKET-IO复用技术 本章目标 IO复用基本概念 select函数 epoll,poll函数 五个I/O模型 阻塞I/O 非阻塞I/O I/O复用(select和poll) 信号驱动I/O 异步I/O 阻塞I/O模型 最流行的I/O模型是阻塞I/O模型,缺省时,所有的套接口都是阻塞的 进程阻塞于 read的调用 应用进程 read 系统调用 内核 无数据准备好 数据报准备好 拷贝数据 拷贝完成 处理数据报 返回成功指示 等待数据 将数据从内核 拷贝到用户空间 非阻塞I/O模型(2-1) 当我们把一个套接口设置为非阻塞方式时,即通知内核:当请求的I/O操作非得让进程睡眠不能完成时,不要让进程睡眠,而应返回一个错误 非阻塞I/O模型(2-2) 应用程序连续不断地查询内核,看看某操作是 否准备好,这对cpu时间是极大的浪费,一般只在专门提供某种功能的系统中才会用到 系统调用 系统调用read 等待返回成功指示 (轮询) 应用进程 read 内核 无数据报准备好 EWOULDBLOCK read 系统调用 无数据准备好 EWOULDBLOCK read 系统调用 数据报准备好 拷贝数据报 等待数据 将数据从内核 拷贝到用户空间 拷贝完成 处理数据报 返回成功提示 I/O复用模型 有了I/O复用,我们就可以调用select或poll,在这两个系统调用的某一个上阻塞,而不是真正阻塞于真正的I/O系统调用 进程受阻于select 调用,等待可能 多个套接口中的任 一个变为可读 数据拷贝到应用缓冲 区期间进程阻塞 应用进程 select 系统调用 内核 无数据准备好 返回可读条件 数据报准备好 read 系统调用 拷贝数据报 拷贝完成 返回成功提示 处理数据报 等待数据 将数据从内核 拷贝到用户空间 信号驱动I/O模型 我们也可以用信号,让内核在描述字准备好时用信号SIGIO通知我们,我们将此方法称为信号驱动I/O 进程继续执行 数据拷贝到应用缓 冲区期间进程阻塞 应用进程 建立SIGIO的信号 处理程序 系统调用sigaction 内核 信号处理程序 递交SIGIO 数据报准备好 read 系统调用 拷贝数据报 拷贝完成 返回成功指示 处理数据报 等待数据 将数据从内核拷贝 到用户空间 返回 异步I/O模型 异步I/O是Posix.1的1993版本中的新内容,我们让内核启动操作,并在整个操作完成后通知我们 进程继续执行 应用进程 aio_read 系统调用 内核 无数据准备好 数据准备好 拷贝数据报 拷贝完成 将数据从内核 拷贝到用户空间 等待数据 信号处理 程序处理 数据报 递交在aio_read中 指定的信号 I/O复用 如果一个或多个I/O条件满足(例如:输入已准备好被读,或者描述字可以承接更多输出的时候)我们就能够被通知到,这样的能力被称为I/O复用,是由函数select和poll支持的 I/O复用网络应用场合 当客户处理多个描述字 一个客户同时处理多个套接口 如果一个tcp服务器既要处理监听套接口,又要处理连接套接口 如果一个服务器既要处理TCP,又要处理UDP select函数作用 这个函数允许进程指示内核等待多个事件中的任一个发生,并仅在一个或多个事

文档评论(0)

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

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

1亿VIP精品文档

相关文档