网络编程--第3章_Windows套接字IO模型.pptVIP

  1. 1、本文档共78页,可阅读全部内容。
  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文档。上传文档
查看更多
网络编程--第3章_Windows套接字IO模型.ppt

1. 套接字模式 Windows套接字在两种模式下执行I/O操作:阻塞和非阻塞。 在阻塞模式下,在I/O操作完成前,执行操作的Winsock函数(比如send和recv)会一直等候下去,不会立即返回程序(即不会将控制权交还给程序),直到该函数操作完成,或出错。 在非阻塞模式下, Winsock函数无论如何都会立即返回。 1.1 阻塞模式 对于处在阻塞模式的套接字,我们必须多加留意,因为在一个阻塞套接字上调用任何一个Winsock API函数,都会产生相同的后果------耗费或长或短的时间“等待”。 一个典型的例子 简单的阻塞模式示例 SOCKET sock; char buff[256]; int done = 0; …… while(!done) { nBytes = recv(sock,buff,65,0); if (nBytes == SOCKET_ERROR) { printf(“recv failed with error %d\n”,WSAGetLastError()); return; } DoComputationData(buff); } …… 1.2 非阻塞模式 非阻塞模式的套接字在使用上稍显困难,但它在功能上是非常强大的。除具备阻塞套接字已有的各项优点之外,还进行了扩充,功能更强。 创建一个套接字,并将其置为非阻塞模式的程序示例: TCP 首部格式 将一个套接字置为非阻塞模式之后, Winsock API调用会立即返回。大多数情况下,这些调用都会“失败”,并返回一个WSAEWOULDBLOCK错误,这意味着请求的操作在调用期间没有完成。 每个TCP套接口有一个发送缓冲区,可以用SO_SNDBUF套接口选项来改变这一缓冲区的大小。 当应用进程调用send往套接口写数据时,内核从应用进程缓冲区中拷贝所有数据到套接口的发送缓冲区,如果套接口发送缓冲区容不下应用程序的所有数据,或者是应用进程的缓冲区大于套接口的发送缓冲区,或者是套接口的发送缓冲区中有别的数据,应用进程将被挂起。内核将不从send返回。直到应用进程缓冲区中的所有数据都拷贝到套接口发送缓冲区。 所以,从写一个TCP套接口的send调用成功返回仅仅表示我们可以重新使用应用进程缓冲区,它并不是告诉我们对方收到数据。TCP发给对方的数据,对方在收到数据时必须给矛确认,只有在收到对方的确认时,本方TCP才会把TCP发送缓冲区中的数据删除。 UDP因为是不可靠连接,不必保存应用进程的数据拷贝,应用进程中的数据在沿协议栈向下传递时,以某种形式拷贝到内核缓冲区,当数据链路层把数据传出后就把内核缓冲区中数据拷贝删除。因此它不需要一个发送缓冲区。写UDP套接口的send返回表示应用程序的数据或数据分片已经进入链路层的输出队列,如果输出队列没有足够的空间存放数据,将返回错误ENOBUFS. 阻塞和非阻塞套接字模式各存在着优点和缺点 从概念的角度说,阻塞套接字更易使用。但在应付建立连接的多个套接字时,或在数据的收发量不均,时间不定时,却显得极难管理。 而另一方面,由于需要编写更多的代码,以便在每个Winsock调用中,对收到一个WSAEWOULDBLOCK错误的可能性加以应付,那么非阻塞套接字便显得有些难于操作。 在这些情况下,可考虑使用“套接字I/O模型”,它有助于应用程序通过一种异步方式,同时对一个或多个套接字上进行的通信事件加以管理。 Select模型是WinSock中最常见的I/O模型。 通过调用select函数可以确定一个或多个套接字的状态,判断套接字上是否有数据,或者能否向一个套接字写入数据,或者出现意外。 目的是防止应用程序在套接字处于阻塞模式中时,在一次I/O绑定调用(如send或recv)过程中,被迫进入“阻塞”状态;同时防止在套接字处于非阻塞模式中时,产生WSAEWOULDBLOCK错误。 函数调用成功返回所有集合中满足条件的套接字数量。同时传入的套接字集合被更新, select() 调用将删除集合中不能进行指定操作的套接字, 集合中保留满足条件的套接字 函数调用失败,返回SOCKET_ERROR。 如超时,返回0。 使用FD_ZERO宏,初始化自己感兴趣的每一个fd_set集合。 使用FD_SET宏,将要检查的套接字加入到一个集合中。 设置等待时间,对timeval中tv_sec和tv_usec字段进行设置。 调用select函数。 select正确返回时,使用FD_ISSET检查一个选定的套接字是否在指定的集合中。 针对不同集合的套接字做出不同的操作。 WSAAsyncSelect函数 int WSAAsyncSelect( SOCKET s, //需要事件通知的套接字 HWND

文档评论(0)

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

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

1亿VIP精品文档

相关文档