




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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){//處理錯誤的代碼}
//返回值大於零,說明有符合條件的套接字,對於本例這個簡單的情況,//select()的返回值應當是1。如果應用程式處理更多的套接字,返回值可能大於1,//應用程式應當檢查特定的套接字是否在返回的集合中。if(ret>0){if(FD_ISSET(s,&fdread)){//對該套接字進行讀操作
}}}8.2WSAAsyncSelect非同步I/O模型非同步I/O模型通過調用WSAAsyncSelect函數實現。利用這個模型,應用程式可在一個套接字上,接收以Windows消息為基礎的網路事件通知。該模型最早出現於Winsock的1.1中,以適應其多任務消息環境。
1.WSAAsyncSelect函數函數的定義是:intWSAAsyncSelect(SOCKETs,HWNDhWnd,unsignedintwMsg,longlEvent);
2.窗口回調例程應用程式在一個套接字上調用WSAAsyncSelect函數時,該函數的hWnd參數指定了一個窗口句柄。函數成功調用後,當指定的網路事件發生時,會自動執行該窗口對應的窗口回調例程。並將網路事件通知和Windows消息的相關資訊,傳遞給該例程的入口參數,用戶可以在該例程中添加自己的代碼,針對不同的網路事件進行處理,從而實現有序的套接字輸入和輸出。
窗口回調例程應定義成如下形式:LRESULTCALLBACKWindowProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam);
3.舉例8.3WSAEventSelect事件選擇模型
WSAEventSelect事件選擇模型和WSAAsyncSelect模型類似,它也允許應用程式在一個或多個套接字上,接收以事件為基礎的網路事件通知。表8.2總結的、由WSAAsyncSelect模型採用的網路事件,均可原封不動地移植到事件選擇模型中。也就是說,在用新模型開發的應用程式中,也能接收和處理所有那些事件。該模型最主要的差別在於,網路事件會投遞至一個事件對象句柄,而非投遞至一個窗口例程。以下按照使用此模型的編程步驟介紹。
1.創建事件對象句柄事件選擇模型要求應用程式針對每一個套接字,首先創建一個事件對象。創建方法是調用WSACreateEvent函數,它的定義如下:WSAEVENTWSACreateEvent(void);函數的返回值很簡單,就是一個創建好的事件對象句柄。
2.關聯套接字和事件對象,註冊關心的網路事件有了事件對象句柄後,接下來必須將其與某個套接字關聯在一起,同時註冊感興趣的網路事件類型(表8-2),這就需要調用WSAEventSelect函數,函數的定義為:intWSAEventSelect(SOCKETs,WSAEVENThEventObject,longlNetworkEvents);
3.等待網路事件觸發事件對象句柄的工作狀態將一個套接字同一個事件對象句柄關聯在一起以後,應用程式便可以調用WSAWaitForMultipleEvents函數,等待網路事件觸發事件對象句柄的工作狀態。該函數用來等待一個或多個事件對象句柄,當其中一個或所有句柄進入“已傳信”狀態後,或在超過了一個規定的時間期限後,立即返回。該函數的定義:DWORDWSAWaitForMultipleEvents(DWORDcEvents,constWSAEVENTFAR*lphEvents,BOOLfWaitAll,DWORDdwTimeout,BOOLfAlertable);
4.檢查套接字上所發生的網路事件類型知道了造成網路事件的套接字後,接下來可調用WSAEnumNetworkEvents函數,檢查套接字上發生了什麼類型的網路事件。該函數定義如下:intWSAEnumNetworkEvents(SOCKETs,WSAEVENThEventObject,LPWSANETWORKEVENTSlpNetworkEvents);
5.處理網路事件在確定了套接字上發生的網路事件類型後,可以根據不同的情況做出相應的處理。完成了對WSANETWORKEVENTS結構中的事件的處理之後,應用程式應在所有可用的套接字上,繼續等待更多的網路事件。應用程式完成了對一個事件對象的處理後,便應調用WSACloseEvent函數,釋放由事件句柄使用的系統資源。函數的定義如下:BOOLWSACloseEvent(WSAEVENThEvent);該函數也將一個事件句柄作為自己唯一的參數,並會在成功後返回TRUE,失敗後返回FALSE。
6.舉例
8.4其他模型在Winsock中,重疊I/O(OverlappedI/O)模型能使應用程式達到更佳的性能。重疊模型的基本原理是讓應用程式使用一個重疊的數據結構,一次投遞一個或多個Winsock的I/O請求。針對那些提交的請求,在它們完成之後,應用程式可為它們提供服務。自Winsock2.0發佈開始,重疊I/O便已集成到新的Winsock函數中,比如WSASend和WSARecv等。因此,重疊I/O模型適用於
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 咖啡厅翻新合同样本
- 招商部用人合同范本
- 餐饮连锁加盟合同
- 亚克力板采购合同范本
- 企业展示与汇报模板
- 阳台防水合同范本
- 陕西省汉中市2025届普通高中高三质量检测考试语文试题及参考答案
- 全国高校教师教学技能大赛(说课比赛)特等奖课件《国家安全》
- 语言学研究方法论知到课后答案智慧树章节测试答案2025年春牡丹江师范学院
- 2025简式的蔬菜交易合同
- DB12T 1361-2024 地热尾水回灌技术规程
- 2024年中考语文复习:非连续性文本阅读(含练习题及答案)
- 成人脑室外引流护理-中华护理学会团体 标准
- 2024年出售铝厂铝渣合同范本
- 地方导游基础知识电子教案 专题七 学习情境一 陕西省课时教案
- 项目管理工程师招聘笔试题与参考答案(某大型集团公司)2024年
- 高中文言文实词虚词总集(打印版)
- 24年追觅在线测评28题及答案
- 婚礼主要工作人员及分工职责
- 医院改造工程设计服务方案
- 职业本科《大学英语》课程标准
评论
0/150
提交评论