互联网络程序设计第8章.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文档。上传文档
查看更多
5. 测试用例 按第7章回归 思考题 ET版本的echo服务器和客户端 第八章、非阻塞服务器与客户端 概述 buffer的管理 非阻塞客户端 非阻塞服务器 测试用例 1. 概述 非阻塞模型 Process blocks in recvfrom recvfrom Appliction Kernel No data ready System call Process data Copy complete System call Data ready Copy data Wait for data Copy data from kernel to user EWOULDBLOCK recvfrom No data ready System call EWOULDBLOCK recvfrom System call recvfrom recvfrom No data ready No data ready No data ready System call No data ready EWOULDBLOCK System call No data ready recvfrom System call EWOULDBLOCK No data ready recvfrom System call EWOULDBLOCK 套接字的默认状态是阻塞的,即当系统调用不能立即完成时,进程会阻塞到该调用完成 可以通过修改修改文件描述符的选项使某个描述符上的动作变为非阻塞的模式 #include fcntl.h int fcntl(int fd, int cmd, … /* int arg */); Return: depends on cmd if OK, -1 on error cmd表示对fd的操作 F_GETFL,获取文件描述符选项 F_SETFL,设置文件描述符选项 int flags = fcntl(fd, F_GETFL); flags |= O_NOBLOCK; fcntl(fd, F_SETFL, O_NOBLOCK); 常见的非阻塞操作 非阻塞读 read/readv/recv/recvfrom/recvmsg,如果接收buffer没有数据,直接返回EAGAIN 非阻塞写 write/writev/send/sendto/sendmsg,如果底层的发送buffer空间不够,返回值是内核拷贝的字节数,同时系统会设置errno为EAGAIN 非阻塞accept 返回-1,errno为EAGAIN 非阻塞connect 返回-1,errno为EINPROGRESS 2. buffer的管理 在前面的迭代、多进程、多线程、IO复用技术中,我们并没有对buffer进行管理,原因是: write在阻塞的方式下,能够起到流控的作用。自然的阻塞在那里,等到发送完毕。 但是在非阻塞方式下,write可以写一半的数据就返回,这要求我们显式地对数据缓冲进行管理 echo客户端对buffer的需求 单线程/多线程? 一个生产者、一个消费者 buffer的大小固定 环形队列 地址低位 buffer的size 数据起始指针 数据size 这里的问题是数据区和空闲区分为两个部分,该如何发送、接收? writev、readv 地址低位 地址低位 数据 数据 数据的摆放 readv/writev #include sys/uio.h ssize_t readv(int fd, const struct iovec *iov, int cnt); ssize_t writev(int fd, const struct iovec *iov, int cnt); 返回:读到或写出的字节数,出错时为-1。 功能与read/write类似,scatter读、gather写 另外注意iov是const iovec*,说明系统不会修改iov /* Structure for scatter/gather I/O. */ struct iovec { void *iov_base; /* Pointer to data. */ size_t iov_len; /* Length of data. */ }; len0 len1 …… lenN vector[0].iov_base vector[0].iov_len vector[1].iov_base vector[1].iov_len vector[count-1].iov_base vector[count-1].iov_len 缓存0 len0 缓存1 len1 缓存N lenN CircleBuffer 比较复杂 3. 非阻塞客户端 实际的非阻塞编程,并非象第6章中IO模型所介绍的,需

文档评论(0)

精品家园 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档