网络编程技术(西电课件)_第8节-1.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文档。上传文档
查看更多
case FD_READ: ret = recv(wParam, szMessage, MSGSIZE, 0); if (ret == 0 || ret == SOCKET_ERROR WSAGetLastError() == WSAECONNRESET) { closesocket(wParam); } else { szMessage[ret] = \0; send(wParam, szMessage, strlen(szMessage), 0); } break; case FD_CLOSE: closesocket(wParam); break; } //其他代码省略。具体代码可以参照MFC生成的框架 异步选择模型的优缺点 优点:WSAAsyncSelect 提供了读写数据能力的异步通知,不需要像select模型那样去遍历多个套接字 缺点: 必须要使用一个窗口接收消息,如果处理成千上万的套接字就力不从心了 * * 以套接字为例,在阻塞模式下,利用TCP协议发送一个报文时,如果低层协议没有可用空间来存放用户数据,则应用进程将阻塞等待直到协议有可用的空间。而在非阻塞模式下,调用将直接返回而不需等待。在应用进程调用接收函数接收报文时,如果是在阻塞模式下,若没有到达的数据,则调用将一直阻塞直到有数据到达或出错;而在非阻塞模式下,将直接返回而不需等待。 * 不同操作系统下,在非阻塞模式下,不能完成的I/O操作返回的错误代码也是不一样的。例如,SystemⅤ返回EAGAIN错误,而源自Berkeley的实现返回EWOULDBLOCK错误。更混乱的是,Posix.1指定使用EAGAIN,而Posix.1g指定使用EWOULDBLOCK。大多数系统(包括SVR4和4.3BSD)将这两个错误代码定义为相同的值。 * select(选择)模型是Winsock中最常见的I/O模型。之所以称其为“ select模型”,是由于它的“中心思想”便是利用select函数,实现对I/O的管理!最初设计该模型时,主要面向的是某些使用Unix操作系统的计算机,它们采用的是Berkeley套接字方案。select模型已集成到Winsock 1.1中,它使那些想避免在套接字调用过程中被无辜“阻塞”的应用程序,采取一种有序的方式,同时进行对多个套接字的管理。由于Winsock 1.1向后兼容于Berkeley套接字实施方案,所以假如有一个Berkeley套接字应用使用了select函数,那么从理论角度讲,毋需对其进行任何修改,便可正常运行。 利用select函数,我们判断套接字上是否存在数据,或者能否向一个套接字写入数据。之所以要设计这个函数,唯一的目的便是防止应用程序在套接字处于阻塞模式中时,在一次I/O绑定调用(如send或recv)过程中,被迫进入“阻塞”状态;同时防止在套接字处于非阻塞模式中时,产生WSAEWOULDBLOCK错误。除非满足事先用参数规定的条件,否则select函数会在进行I/O操作时阻塞。 *   参数nfds指明被检查的套接字描述符的值域,一般被忽略;   参数readfds指向要做读检测的套接字描述符集合的指针,调用者希望从中读取数据;   参数writefds指向要做写检测的套接字描述符集合的指针;   参数exceptfds指向要检测是否出错的套接字描述符集合的指针;   参数timeout指向select()等待的最大时间,如设为NULL,则为阻塞时间。参数timeout为timeval结构数据,其中tv_sec字段以s为单位指定等待时间,tv_usec则以ms为单位指定等待时间。若将超时值设置为(0, 0),则Select会立即返回,允许应用程序对Select进行轮询,出于对性能方面的考虑,应避免这样的设置。 *   参数nfds指明被检查的套接字描述符的值域,一般被忽略;   参数readfds指向要做读检测的套接字描述符集合的指针,调用者希望从中读取数据;   参数writefds指向要做写检测的套接字描述符集合的指针;   参数exceptfds指向要检测是否出错的套接字描述符集合的指针;   参数timeout指向select()等待的最大时间,如设为NULL,则为阻塞时间。参数timeout为timeval结构数据,其中tv_sec字段以s为单位指定等待时间,tv_usec则以ms为单位指定等待时间。若将超时值设置为(0, 0),则Select会立即返回,允许应用程序对Select进行轮询,出于对性能方面的考虑,应避免这样的设置。 * s参数指定的是我们感兴趣的那个套接字。hWnd参

文档评论(0)

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

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

1亿VIP精品文档

相关文档