WSAASYNCSELECT-IO-模型的程序設(shè)計(jì)_第1頁(yè)
WSAASYNCSELECT-IO-模型的程序設(shè)計(jì)_第2頁(yè)
WSAASYNCSELECT-IO-模型的程序設(shè)計(jì)_第3頁(yè)
WSAASYNCSELECT-IO-模型的程序設(shè)計(jì)_第4頁(yè)
WSAASYNCSELECT-IO-模型的程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

WSAASYNCSELECTI/O模型的程序設(shè)計(jì)實(shí)驗(yàn)?zāi)康耐ㄟ^(guò)本次實(shí)驗(yàn),掌握winsock提供了WSAASYNselect異步I/O模型,利用這個(gè)模型,應(yīng)用程序可在一個(gè)套接字上,接收以windows消息為基礎(chǔ)的網(wǎng)絡(luò)事件通知。實(shí)驗(yàn)任務(wù)根據(jù)實(shí)驗(yàn)的要求完成,先畫(huà)出實(shí)驗(yàn)程序的整體框架的流程圖,明確步驟后。根據(jù)各步驟編寫(xiě)相應(yīng)的程序,完成后,進(jìn)行調(diào)試,修改,直至完成整個(gè)實(shí)驗(yàn)報(bào)告,最后撰寫(xiě)實(shí)驗(yàn)報(bào)告。實(shí)驗(yàn)設(shè)計(jì)方案在應(yīng)用程序中,首先必須用C reateWindow函數(shù)創(chuàng)建一個(gè)窗口,再為該窗口提供一個(gè)窗口例程支持函數(shù)(winproc)。應(yīng)用程序在一個(gè)套接字上成功調(diào)用了WSAAsynselect之后,應(yīng)用程序會(huì)在與hwnd窗口句柄參數(shù)對(duì)應(yīng)的窗口例程中以windows消息形式,接受網(wǎng)絡(luò)事件通知。窗口例程windowPro的Wparam參數(shù)指定在其上面發(fā)生了一個(gè)網(wǎng)絡(luò)事件的套接字。1Param的低字(低位字)指定了已發(fā)生的網(wǎng)絡(luò)事件,而1Param參數(shù)的高字(高位字)包含了可能出現(xiàn)的任何錯(cuò)誤代碼,可用兩個(gè)特殊的宏去獲取低位字,高位字的值。算法,流程圖及關(guān)鍵代碼說(shuō)明異步復(fù)用I/O模型的說(shuō)明:異步I/O復(fù)用模型Winsock提供了一個(gè)有用的異步I/O模型。利用這個(gè)模型,應(yīng)用程序可在一個(gè)套接字上,接收以Windows消息為基礎(chǔ)的網(wǎng)絡(luò)事件通知。具體的做法是在建好一個(gè)套接字后,調(diào)用WSAAsyncSelect函數(shù)。該模型最早出現(xiàn)于Winsock的1.1版本中,用于幫助應(yīng)用程序開(kāi)發(fā)者面向一些早期的16位Windows平臺(tái)(如Windows

for

Workgroups),適應(yīng)其“落后”的多任務(wù)消息環(huán)境。應(yīng)用程序仍可從這種模型中得到好處,特別是它們用一個(gè)標(biāo)準(zhǔn)的Windows例程(常稱(chēng)為"WndProc"),對(duì)窗口消息進(jìn)行管理的時(shí)候。I/O模型WSAAsyncSelect模型原理圖程序設(shè)計(jì)流程圖:①對(duì)流程圖進(jìn)行解析:首先,我們得用描述主窗口的參數(shù)填充WNDCLASSEX結(jié)構(gòu),注冊(cè)窗口類(lèi),之后便是創(chuàng)建主窗口,將主窗口顯示出來(lái)(出錯(cuò)與否),然后創(chuàng)建套接字,WSAAsyncSelect,綁定套接字到本地機(jī)器,指定監(jiān)聽(tīng)的端口號(hào),創(chuàng)建監(jiān)聽(tīng)套接字,進(jìn)入監(jiān)聽(tīng)模式,最后消息循環(huán),退出系統(tǒng)。②代碼及說(shuō)明#include"../common/initsock.h"#include<stdio.h>#defineWM_SOCKETWM_USER+101 //自定義消息CInitSocktheSock;LRESULTCALLBACKWindowProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam);intmain(){ charszClassName[]="MainWClass"; WNDCLASSEXwndclass; //用描述主窗口的參數(shù)填充WNDCLASSEX結(jié)構(gòu) wndclass.cbSize=sizeof(wndclass); wndclass.style=CS_HREDRAW|CS_VREDRAW; wndclass.lpfnWndProc=WindowProc; wndclass.cbClsExtra=0; wndclass.cbWndExtra=0; wndclass.hInstance=NULL; wndclass.hIcon=::LoadIcon(NULL,IDI_APPLICATION); wndclass.hCursor=::LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground=(HBRUSH)::GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName=NULL; wndclass.lpszClassName=szClassName; wndclass.hIconSm=NULL; ::RegisterClassEx(&wndclass); //創(chuàng)建主窗口 HWNDhWnd=::CreateWindowEx( 0, szClassName, "", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, NULL, NULL); if(hWnd==NULL) { ::MessageBox(NULL,"創(chuàng)建窗口出錯(cuò)!","error",MB_OK); return-1; } USHORTnPort=4567; //此服務(wù)器監(jiān)聽(tīng)的端口號(hào)注:此處4567為編寫(xiě)時(shí)端口,調(diào)試時(shí)用42247,42503兩個(gè)端口測(cè)試。 //創(chuàng)建監(jiān)聽(tīng)套節(jié)字 SOCKETsListen=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); sockaddr_insin; sin.sin_family=AF_INET; sin.sin_port=htons(nPort); sin.sin_addr.S_un.S_addr=INADDR_ANY; //綁定套節(jié)字到本地機(jī)器 if(::bind(sListen,(sockaddr*)&sin,sizeof(sin))==SOCKET_ERROR) { printf("Failedbind()\n"); return-1; } //將套接字設(shè)為窗口通知消息類(lèi)型。 ::WSAAsyncSelect(sListen,hWnd,WM_SOCKET,FD_ACCEPT|FD_CLOSE); //進(jìn)入監(jiān)聽(tīng)模式 ::listen(sListen,5); //從消息隊(duì)列中取出消息 MSGmsg; while(::GetMessage(&msg,NULL,0,0)) { //轉(zhuǎn)化鍵盤(pán)消息 ::TranslateMessage(&msg); //將消息發(fā)送到相應(yīng)的窗口函數(shù) ::DispatchMessage(&msg); } //當(dāng)GetMessage返回0時(shí)程序結(jié)束 returnmsg.wParam;}LRESULTCALLBACKWindowProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam){ switch(uMsg) { caseWM_SOCKET: { //取得有事件發(fā)生的套節(jié)字句柄 SOCKETs=wParam; //查看是否出錯(cuò) if(WSAGETSELECTERROR(lParam)) { ::closesocket(s); return0; } //處理發(fā)生的事件 switch(WSAGETSELECTEVENT(lParam)) { caseFD_ACCEPT: //監(jiān)聽(tīng)中的套接字檢測(cè)到有連接進(jìn)入 { SOCKETclient=::accept(s,NULL,NULL); ::WSAAsyncSelect(client,hWnd,WM_SOCKET,FD_READ|FD_WRITE|FD_CLOSE); } break; caseFD_WRITE: { } break; caseFD_READ: { charszText[1024]={0}; if(::recv(s,szText,1024,0)==-1) ::closesocket(s); else printf("接收數(shù)據(jù):%s",szText); } break; caseFD_CLOSE: { ::closesocket(s); } break; } } return0; caseWM_DESTROY: ::PostQuitMessage(0); return0; } //將我們不處理的消息交給系統(tǒng)做默認(rèn)處理 return::DefWindowProc(hWnd,uMsg,wParam,lParam);}調(diào)試結(jié)果運(yùn)行調(diào)試截圖改進(jìn)意見(jiàn)與心得體會(huì)通過(guò)此次實(shí)驗(yàn),我們掌握了winsock提供了WSAASYNselect異步I/O模型,利用這個(gè)模型,應(yīng)用程序可在一個(gè)套接字上,接收以windows消息為基礎(chǔ)的網(wǎng)絡(luò)事件通知。WASSsyncSelect模型的特點(diǎn)是將套接字綁定到窗口句柄,將網(wǎng)絡(luò)事件與windows消息相關(guān)聯(lián)。當(dāng)套接字有網(wǎng)絡(luò)事件發(fā)生時(shí),將網(wǎng)絡(luò)事件以windows消息的形式派發(fā)給綁定的窗口,然后在窗口函數(shù)windowProc中處理windows消息(即網(wǎng)絡(luò)事件)。本次實(shí)驗(yàn)中

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論