1重疊模型的優(yōu)點
創(chuàng)新互聯(lián)服務項目包括雙流網(wǎng)站建設、雙流網(wǎng)站制作、雙流網(wǎng)頁制作以及雙流網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網(wǎng)行業(yè)的解決方案,雙流網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到雙流省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
1可以運行在支持Winsock2的所有Windows平臺,而不像完成端口只支持NT系統(tǒng)
2比起阻塞,select,WSAAsyncSelect以及WSAEventSelect等模型,重疊I/O(Overlapped I/O)模型使應用程序能達到更加系統(tǒng)性能
因為他和其他4種模型不同的是,使用重疊模型的應用程序通知緩沖區(qū)收發(fā)系統(tǒng)直接使用數(shù)據(jù),也就是說,如果應用程序
投遞了一個10kb大小的緩沖區(qū)來接收數(shù)據(jù),而數(shù)據(jù)已經(jīng)到達套接字,則將該數(shù)據(jù)直接拷貝到投遞的緩沖區(qū),
而4種模型中,數(shù)據(jù)達到并拷貝到單套接字接收緩沖區(qū),此時應用程序會被告知可以讀入的容量,當應用程序調用
接收函數(shù)之后,數(shù)據(jù)才從單套接字緩沖區(qū)拷貝應用程序到緩沖區(qū),差別就體現(xiàn)了。
2重疊模型的基本原理
重疊模型是讓應用程序使用重疊數(shù)據(jù)結構(WSAOVERLAPPED),一次投遞一個或多個Winsock I/O請求,針對這些提交的
請求,在他們完成之后,應用程序會收到通知,于是就可通過自己的代碼來處理這些數(shù)據(jù)了。
使用事件通知的方法來實現(xiàn)重疊IO模型,基于事件的話,就要求將Win事件與WSAOVERLAPPED結構關聯(lián)在一起,
使用重疊結構,常用的send,sendto,recv,recvform也被WSASend,WSARecv等替換掉,
OVERLAPPER SOCKET(重疊Socket)上進行重疊發(fā)送的操作,(簡單的理解就是異步send,recv)
他們的參數(shù)中都有一個Overlapped參數(shù),就是說所有的重疊Socket都要綁定到這個重疊結構體上,
提交一個請求,其他的事情就交給重疊結構去操心, 而其中重疊結構要與Windows事件綁定在一起,
在樣,我們調用完WSARecv后.等重疊操作完成,就會有對應的事件來同意我們操作完成,
2重疊模型的基礎知識
typedef struct _OVERLAPPED { ULONG_PTR Internal; ULONG_PTR InternalHigh; union { struct { DWORD Offset; DWORD OffsetHigh; } DUMMYSTRUCTNAME; PVOID Pointer; } DUMMYUNIONNAME; HANDLE hEvent; //我們只要關注這個參數(shù), 用來關聯(lián)事件的 } OVERLAPPED, *LPOVERLAPPED;
2WSARecv系列函數(shù)
在重疊模型中,接收數(shù)據(jù)就要靠他了,他的參數(shù)也比recv多定義是這樣的:
int WSArecv( SOCKET s, //投遞這個操作的套接字 LPWSABUF lpBuffer,//接收緩沖區(qū),與Recv函數(shù)不同 LPDWORD lpNumberOfBytesRecvd,//如果接收操作立即完成,這里會返回函數(shù)調用 LPDWORD lpFlags, //默認為0 LPWSAOVERLAPPER lpOverlapper,//綁定的重疊結構 LPWSAOVERLAPPER_COMPLETION_ROUTINE lpCompletionRoutine //一個回調 ); 返回值: WSA_IO_PENDING:常見返回值,說明WSARecv操作成功,但是I/O材質沒完成,所以需要綁定一個事件來通知
3WSAWaitForMultipleEvents函數(shù)
等待某個事件觸發(fā)的函數(shù),我們需要事件通知我們完成重疊操作,所以需要用到這個參數(shù)。
這個函數(shù)只能有WSA_MAXIMUM_WAIT_EVENTS對象定義的一個最大值,是64,就是他只能等待64個事件
如果決的小了,就要創(chuàng)建額外的線程,或線程池。
DWORD WSAWaitForMultipleEvents( DWORD cEvents, // 等候事件的總數(shù)量 const WSAEVENT* lphEvents, // 事件數(shù)組的指針 BOOL fWaitAll, // 如果設置為TRUE則事件中所有的事件被傳信才返回,FALSE是當有事件立即返回 DWORD dwTimeout, // 超時時間,如果超時,函數(shù)會返回 WSA_WAIT_TIMEOUT // 如果設置為0,函數(shù)會立即返回 // 如果設置為 WSA_INFINITE只有在某一個事件被傳信后才會返回 BOOL fAlertable ) // 默認用FALSE 返回值: WSA_WAIT_TIMEOUT :最常見的返回值,我們需要做的就是繼續(xù)等待 WSA_WAIT_FAILED : 出現(xiàn)了錯誤,請檢查cEvents和lphEvents兩個參數(shù)是否有效
4WSAGetOverlappedResult函數(shù)
既然通過WSAWaitForMultipleEvents函數(shù)來得到重疊操作的結果,那我們也需要一個函數(shù)來查詢
一下重疊操作的結果, 這個函數(shù)不需要關注返回值
BOOL WSAGetOverlappedResult( SOCKET s, // SOCKET,不用說了 LPWSAOVERLAPPED lpOverlapped, // 這里是我們想要查詢結果的那個重疊結構的指針 LPDWORD lpcbTransfer, // 本次重疊操作的實際接收(或發(fā)送)的字節(jié)數(shù) BOOL fWait, // 設置為TRUE,除非重疊操作完成,否則函數(shù)不會返回 // 設置FALSE,而且操作仍處于掛起狀態(tài),那么函數(shù)就會返回FALSE LPDWORD lpdwFlags // 指向DWORD的指針,負責接收結果標志 第二個參數(shù)是輸出的 第三個參數(shù)也是輸出的,就是你接收的字節(jié)數(shù) 為0那說明對方關閉socket了
網(wǎng)頁題目:SOCKET重疊I/O模型
地址分享:http://chinadenli.net/article22/gigccc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設計、定制網(wǎng)站、網(wǎng)站設計公司、網(wǎng)站導航、移動網(wǎng)站建設、品牌網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)