网站大量收购独家精品文档,联系QQ:2885784924

网络程序设计7-Winsock IO方法教学.ppt

  1. 1、本文档共31页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Winsock I/O方法 网络应用程序模型 内容提要 套接字模式 选择(select)模型 WSAAsyncSelect(异步选择)模型 W S A E v e n t S e l e c t()模型 Overlapped I/O(重叠式I / O) Completion port(完成端口) 1. 套接字模式 Windows套接字在两种模式下执行I/O操作:阻塞和非阻塞。 在阻塞模式下,在I/O操作完成前,执行操作的Winsock函数(比如send和recv)会一直等候下去,不会立即返回程序(即不会将控制权交还给程序),直到该函数操作完成,或出错。 在非阻塞模式下, Winsock函数无论如何都会立即返回。 1.1 阻塞模式 对于处在阻塞模式的套接字,我们必须多加留意,因为在一个阻塞套接字上调用任何一个Winsock API函数,都会产生相同的后果------耗费或长或短的时间“等待”。 大多数Wi n s o c k应用都是遵照一种“生产者-消费者”模型来编制的。在这种模型中,应用程序需要读取(或写入)指定数量的字节,然后以它为基础执行一些计算。 简单的阻塞模式示例 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 非阻塞模式 非阻塞模式的套接字在使用上稍显困难,但它在功能上是非常强大的。除具备阻塞套接字已有的各项优点之外,还进行了扩充,功能更强。 创建一个套接字,并将其置为非阻塞模式的程序示例: 示例 SOCKET s; u_long ul=1; int nRet; s=socket(AF_INET,SOCK_STREAM,0); nRet=ioctlsocket(s,FIONBIO,(unsigned long *)ul); if (nRet==SOCKET_ERROR) { //Failed to put the socket into nonblocking mode } 设置套接字工作模式—ioctlsocket() 函数形式 int ioctlsocket ( SOCKET s, long cmd, u_long * argp ); 功能说明: 套接字默认工作在阻塞模式,此函数设置套接字的工作模式为非阻塞或阻塞模式。 返回值: 正确调用返回0,否则将返回SOCKET_ERROR ,应用程序可以通过 WSAGetLastError()来获取具体错误的代码。 参数说明 SOCKET s :传入参数。用于标识一个套接字的描述符。 cmd :表示对套接字s的操作控制命令。 argp :指向cmd命令所带指针的参数。 函数指针的应用 将一个套接字置为非阻塞模式之后, Winsock API调用会立即返回。大多数情况下,这些调用都会“失败”,并返回一个WSAEWOULDBLOCK错误,这意味着请求的操作在调用期间没有完成。 例如在系统的输入缓冲区中,尚不存在“待决”的数据,那么recv(接收数据)调用就会返回WSAEWOULDBLOCK错误。通常,我们需要重复调用同一个函数,直至获得一个成功返回代码。 阻塞和非阻塞套接字模式各存在着优点和缺点 从概念的角度说,阻塞套接字更易使用。但在应付建立连接的多个套接字时,或在数据的收发量不均,时间不定时,却显得极难管理。 而另一方面,由于需要编写更多的代码,以便在每个Winsock调用中,对收到一个WSAEWOULDBLOCK错误的可能性加以应付,那么非阻塞套接字便显得有些难于操作。 在这些情况下,可考虑使用“套接字I/O模型”,它有助于应用程序通过一种异步方式,同时对一个或多个套接字上进行的通信事件加以管理。 2. select模型 五种类型的套接字I/O模型,可让Winsock应用程序对I/O进行管理。 select模型(选择) WSAAsyncSelect模型(异步选择) WSAEventSelect模型(事件选择) overlapped模型(重叠) completionport模型(完成端口) select函数 函数原型 int select(int nfds, fd_set *readfds, fd_set *writefds,

文档评论(0)

xuefei111 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档