已经提到WinSock在进行输入输出的时候可以采.ppt
上传人:天马****23 上传时间:2024-09-11 格式:PPT 页数:29 大小:225KB 金币:10 举报 版权申诉
预览加载中,请您耐心等待几秒...

已经提到WinSock在进行输入输出的时候可以采.ppt

已经提到WinSock在进行输入输出的时候可以采.ppt

预览

免费试读已结束,剩余 19 页请下载文档后查看

10 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

套接字I/O模型select模型WSAAsyncSelect(异步选择)模型WSAEventSelect(事件选择)模型OverlappedI/O(重叠I/O)模型IOCompletionport(完成端口)模型不同的Windows平台支持不同的I/O模型,详细的请参考表8.18.1select模型select模型是Winsock中最常见的I/O模型。它的设计思想是利用select函数,实现对多个套接字I/O的管理。利用select函数,可以判断套接字上是否存在数据,或者能否向一个套接字写入数据。只有在条件满足时,才对套接字进行输入输出操作,从而避免无功而返的I/O函数调用,避免频繁产生WSAEWOULDBLOCK错误。1.select的函数select的函数原型如下,其中fd_set数据类型代表一系列特定套接字的集合。intselect(intnfds,fd_setFAR*readfds,fd_setFAR*writefds,fd_setFAR*exceptfds,conststructtimevalFAR*timeout);说明:select函数对readfds、writefds和exceptfds三个集合中指定的套接字进行检查,看是否有数据可读、可写或有带外数据,如果有至少一个套接字符合条件,就立即返回。符合条件的套接字仍在集合中,不符合条件的套接字则被删去。如果一个也没有,则等待。但最多等待timeout所指定的时间,便返回。2.操作套接字集合的宏在应用程序中,用select对套接字进行监视之前,必须先将要检查的套接字句柄分配给某个集合,设置好相应的fd_set结构,再来调用select函数,便可知道一个套接字上是否正在发生上述的I/O活动。Winsock提供了下列宏操作,专门对fd_set数据类型进行操作:(其中参数s是一个要检查的套接字,参数set是一个fd_set集合类型的指针)(1)FD_CLR(s,*set):从set中删除套接字s。(2)FD_ISSET(s,*set):检查s是否set集合的一名成员;如果是则返回TRUE,否则返回FALSE。(3)FD_SET(s,*set):将套接字s加入集合set。(4)FD_ZERO(*set):将set初始化成空集合。例如,调用select函数前,可使用FD_SET宏,将指定的套接字加入到fd_read集合中,select函数完成后,可使用FD_ISSET宏,来检查该套接字是否仍在fd_read集合中。3.select模型的操作步骤用select操作一个或多个套接字,采用下述步骤:(1)使用FD_ZERO宏初始化自己感兴趣的每一个fd_set集合。(2)使用FD_SET宏,将要检查的套接字句柄添加到自己感兴趣的fd_set集合中。(3)调用select函数,然后等待。select完成返回后,会修改每个fd_set结构,删除那些不存在待决I/O操作的套接字句柄,在各个fd_set集合中返回符合条件的套接字。(4)根据select的返回值,使用FD_ISSET宏,对每个fd_set集合进行检查,判断一个特定的套接字是否仍在集合中,便可判断出哪些套接字存在着尚未完成(待决)的I/O操作。(5)知道了每个集合中“待决”的I/O操作之后,对相应的套接字的I/O进行处理,然后返回步骤1,继续进行select处理。4.举例下面的例子用select管理一个套接字上的I/O操作。SOCKETs;//定义一个套接字fd_setfdread;//定义一个套接字集合变量intret;//返回值//创建一个套接字,并接受连接.......//管理该套接字上的输入/输出while(TRUE){//在调用select()之前,总是要清除套接字集合变量FD_ZERO(&fdread);//将套接字s添加到fdread集合中FD_SET(s,&fdread);//调用select()函数,并等待它的完成,这里只是想检查s是否有数据可读if((ret=select(0,&fdread,NULL,NULL,NULL))==SOCKET_ERROR){//处理错误的代码}//返回值大于零,说明有符合条件的套接字,对于本例这个简单的情况,//select()的返回值应当是1。如果应用程序处理更多的套接字,返回值可能大于1,//应用程序应当检查特定的套接字是否在返回的集合中。if(ret>0){if(FD_ISSET(s,&fdread)){//对该套接字进行读操作}}}8.2WSAAsyncSelect异步I/O模型异步I/O模型通过调用WSAAsyncSelect函数实现。利用这个模型,应用程序