Winsock的输入输出模型课件.pptVIP

  1. 1、本文档共25页,可阅读全部内容。
  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文档。上传文档
查看更多

Winsock的輸入/輸出模型這些模型包括select(選擇)、WSAAsyncSelect(非同步選擇)、WSAEventSelect(事件選擇)、OverlappedI/O(重疊式I/O)以及Completionport(完成端口)。限於篇幅,本章將主要介紹前三種。不同的Windows平臺支持不同的I/O模型。如表8.1所示:8.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數據類型進行操作(1)FD_CLR(s,*set):從set中刪除套接字s。(2)FD_ISSET(s,*set):檢查s是否set集合的一名成員;如答案是肯定的是,則返回TRUE。(3)FD_SET(s,*set):將套接字s加入集合set。(4)FD_ZERO(*set):將set初始化成空集合。其中,參數s是一個要檢查的套接字,參數set是一個fd_set集合類型的指針。例如,調用select函數前,可使用FD_SET宏,將指定的套接字加入到fd_read集合中,select函數完成後,可使用FD_ISSET宏,來檢查該套接字是否仍在fd_read集合中。3.select模型的操作步驟用select操作一個或多個套接字句柄,一般採用下述步驟:(1)使用FD_ZERO宏,初始化自己感興趣的每一個fd_set集合。(2)使用FD_SET宏,將要檢查的套接字句柄添加到自己感興趣的每個fd_set集合中,相當在指定的fd_set集合中,設置好要檢查的I/O活動。(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){//處理錯誤的代碼}//返回值大於零,說明有符合條件的套接字,對於本例這個簡單的情況,//selec

文档评论(0)

爱遛弯的张先生 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档