青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

8.2.2 WSAAsyncSelect
Wi n s o c k提供了一個有用的異步I / O模型。利用這個模型,應用程序可在一個套接字上,接收以Wi n d o w s消息為基礎的網絡事件通知。具體的做法是在建好一個套接字后,調用W S A A s y n c S e l e c t函數。該模型最早出現于Wi n s o c k的1 . 1版本中,用于幫助應用程序開發者面向一些早期的1 6位Wi n d o w s平臺(如Windows for Wo r k g r o u p s),適應其“落后”的多任務消息環境。應用程序仍可從這種模型中得到好處,特別是它們用一個標準的Wi n d o w s例程(常
稱為“ w i n p r o c”),對窗口消息進行管理的時候。該模型亦得到了Microsoft Foundation Class
(微軟基本類,M F C)對象C S o c k e t的采納。
消息通知
要想使用W S A A s y n c S e l e c t模型,在應用程序中,首先必須用C r e a t e Wi n d o w函數創建一個窗口,再為該窗口提供一個窗口例程支持函數( Wi n p r o c)。亦可使用一個對話框,為其提供一個對話例程,而非窗口例程,因為對話框本質也是“窗口”??紤]到我們的目的,我們打算用一個簡單的窗口來演示這種模型,采用的是一個支持窗口例程。設置好窗口的框架后,便可開始創建套接字,并調用W S A A s y n c S e l e c t函數,打開窗口消息通知。該函數的定義如下:

int WSAAsyncSelect(
??????????SOCKET s,
??????????HWND?hWnd,
??????????unsigned ?int wMsg,
??????????long lEvent
?????????);

其中, s參數指定的是我們感興趣的那個套接字。h W n d參數指定的是一個窗口句柄,它對應于網絡事件發生之后,想要收到通知消息的那個窗口或對話框。w M s g參數指定在發生網絡事件時,打算接收的消息。該消息會投遞到由h W n d窗口句柄指定的那個窗口。通常,應用程序需要將這個消息設為比Wi n d o w s的W M _ U S E R大的一個值,避免網絡窗口消息與預定義的標準窗口消息發生混淆與沖突。最后一個參數是l E v e n t,它指定的是一個位掩碼,對應于一
系列網絡事件的組合(請參考表8 - 3),應用程序感興趣的便是這一系列事件。大多數應用程序通常感興趣的網絡事件類型包括: F D _ R E A D、F D _ W R I T E、F D _ A C C E P T、F D _ C O N N E C T和
F D _ C L O S E。當然,到底使用F D _ A C C E P T,還是使用F D _ C O N N E C T類型,要取決于應用程序的身份到底是一個客戶機呢,還是一個服務器。如應用程序同時對多個網絡事件有興趣,只需對各種類型執行一次簡單的按位O R(或)運算,然后將它們分配給l E v e n t就可以了。舉個例子來說:

WSAAsyncSelect(s,hWnd,WM_SOCKET,FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE);

這樣一來,我們的應用程序以后便可在套接字s上,接收到有關連接、發送、接收以及套
接字關閉這一系列網絡事件的通知。特別要注意的是,多個事件務必在套接字上一次注冊!
另外還要注意的是,一旦在某個套接字上允許了事件通知,那么以后除非明確調用c l o s e s o c k e t命令,或者由應用程序針對那個套接字調用了W S A A s y n c S e l e c t,從而更改了注冊的網絡事件類型,否則的話,事件通知會永遠有效!若將l E v e n t參數設為0,效果相當于停止在套接字上進行的所有網絡事件通知。

若應用程序針對一個套接字調用了W S A A s y n c S e l e c t,那么套接字的模式會從“鎖定”自動變成“非鎖定”,我們在前面已提到過這一點。這樣一來,假如調用了像W S A R e c v這樣的Wi n s o c k? I / O函數,但當時卻并沒有數據可用,那么必然會造成調用的失敗,并返回W S A E W O U L D B L O C K
錯誤。為防止這一點,應用程序應依賴于由W S A A s y n c S e l e c t的u M s g參數指定的用戶自定義窗口消息,來判斷網絡事件類型何時在套接字上發生;而不應盲目地進行調用。

表8-3 用于W S A A s y n c S e l e c t函數的網絡事件類型

F D _ R E A D?????????????應用程序想要接收有關是否可讀的通知,以便讀入數據
F D _ W R I T E??????????應用程序想要接收有關是否可寫的通知,以便寫入數據
F D _ O O B????????????????應用程序想接收是否有帶外( O O B)數據抵達的通知
F D _ A C C E P T???????應用程序想接收與進入連接有關的通知
F D _ C O N N E C T????應用程序想接收與一次連接或者多點j o i n操作完成的通知
F D _ C L O S E?????????????應用程序想接收與套接字關閉有關的通知
F D _ Q O S????????????應用程序想接收套接字“服務質量”(Q o S)發生更改的通知
F D _ G R O U P _ Q O S?????????????應用程序想接收套接字組“服務質量”發生更改的通知(現在沒什么用處,為未來套接字組的使用保留)
F D _ R O U T I N G _ I N T E R FA C E _ C H A N G E???????應用程序想接收在指定的方向上,與路由接口發生變化的通知
F D _ A D D R E S S _ L I S T _ C H A N G E???????應用程序想接收針對套接字的協議家族,本地地址列表發生變化的通知

應用程序在一個套接字上成功調用了W S A A s y n c S e l e c t之后,應用程序會在與h W n d窗口句柄參數對應的窗口例程中,以Windows消息的形式,接收網絡事件通知。窗口例程通常定義如下:

LRESULT CALLBACK WindProc(
?????????????HWND hWnd,
?????????????UINT uMsg,
?????????????WPARAM wParam,
?????????????LPARAM lParam
?????????????);
其中,h W n d參數指定一個窗口的句柄,對窗口例程的調用正是由那個窗口發出的。u M s g參數指定需要對哪些消息進行處理。就我們的情況來說,感興趣的是W S A A s y n c S e l e c t調用中定義的消息。w P a r a m參數指定在其上面發生了一個網絡事件的套接字。假若同時為這個窗口例程分配了多個套接字,這個參數的重要性便顯示出來了。在l P a r a m參數中,包含了兩方面重要的信息。其中, l P a r a m的低字(低位字)指定了已經發生的網絡事件,而l P a r a m的高字
(高位字)包含了可能出現的任何錯誤代碼。
網絡事件消息抵達一個窗口例程后,應用程序首先應檢查l P a r a m的高字位,以判斷是否在套接字上發生了一個網絡錯誤。這里有一個特殊的宏: W S A G E T S E L E C T E R R O R,可用它返回高字位包含的錯誤信息。若應用程序發現套接字上沒有產生任何錯誤,接著便應調查到底是哪個網絡事件類型,造成了這條Wi n d o w s消息的觸發—具體的做法便是讀取l P a r a m之低字位的內容。此時可使用另一個特殊的宏:W S A G E T S E L E C T E V E N T,用它返回l P a r a m的低字部分。
在程序清單8 - 5中,我們向大家演示了如何使用W S A A s y n c S e l e c t這種I / O模型,來實現窗口消息的管理。在源程序中,我們著重強調的是開發一個基本服務器應用要涉及到的基本步驟,忽略了開發一個完整的Wi n d o w s應用需要涉及到的大量編程細節。

程序清單8-5 WSAAsyncSelect服務器示范代碼

#define WM_SOCKET? WM_USER+1
#inlude <windows.h>

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR ?lpCmdline,int nCmdShow)
{
?SOCKET listen;
?HWND window;
?//create a window? and assign the serverWinProc blew to it
?window = CreateWindow();
?//start winsock and create a socket
?
?WSAStarup(...);
?listen = Socket();
?//Bind the socket to port 5150
?// and begin listening for connection
?
?InternetAddr.sin_family = AF_INET;
?InternetAddr.sin_addr.s_addr=htonl(INADDR_ANY);
?InternetAddr.sin_port = htons(5150);
?bind(listen,(PSOCKETADDR)&InternetAddr,sizeof(InternetAddr));
?
?//set up window message notification on the new socket using the WM_SOCKET define above
?WSAAsyncSelect(listen,window,WM_SOCKET,FD_ACCEPT|FD_CLOSE);
?
?listen(listen,5);
?
?//translate and dispatch window messages
?//until the appliation terminates
}?????????????


BOOL CALLBACK ServerWinProc(HWND hDlg,WORD wMsg,WORD wParam,WORD lParam)
{
?SOCKET accept;
?switch(wMsg)
?{
??case?WM_PAINT:
?????break;
??case?WM_SOCKET:
?????//determine whether an error occured on the socket
?????//by using the WSAGETSELECTERROR() macro
?????
?????if(WSAGETSELECTERROR(lWparam))
?????{
??????//display the error and close the socket
??????closesocket(wParam);
??????break;
?????}
?????//determine what event occured on the socket
?????
?????switch(WSAGETSELECTEVENT(lParam)
?????{
??????case?FD_ACCEPT:
?????????//ACCEPT an incoming connection
?????????Accept = accept(wParam,NULL,NULL);
?????????
?????????//prepare accepted socket for read
?????????//write,and close notifation
?????????
?????????WSAAsyncSelect(Accept,hWnd,WM_SOCKET,FD_READ|FD_WRITE|FD_CLOSE);
??????case?FD_READ:
?????????//RECEIVE data from the socket in wParam
?????????break;
??????case?FD_WRITE:
?????????//THE socket in wParam is ready for sending data
?????????
?????????break;
??????case?FD_CLOSE:
?????????//THE connection is now closed
?????????closesocket(wParam);
?????????break;
?????????
?????}
?????break;
?}
?return TRUE;
}

最后一個特別有價值的問題是應用程序如何對F D _ W R I T E事件通知進行處理。只有在三
種條件下,才會發出F D _ W R I T E通知:
■ 使用c o n n e c t或W S A C o n n e c t,一個套接字首次建立了連接。
■ 使用a c c e p t或W S A A c c e p t,套接字被接受以后。
■ 若s e n d、W S A S e n d、s e n d t o或W S A S e n d To操作失敗,返回了W S A E W O U L D B L O C K錯
誤,而且緩沖區的空間變得可用因此,作為一個應用程序,自收到首條F D _ W R I T E消息開始,便應認為自己必然能在一個套接字上發出數據,直至一個s e n d、W S A S e n d、s e n d t o或W S A S e n d To返回套接字錯誤W S A E W O U L D B L O C K。經過了這樣的失敗以后,要再用另一條F D _ W R I T E通知應用程序再次發送數據。
????????????

Posted on 2006-09-12 16:52 艾凡赫 閱讀(937) 評論(0)  編輯 收藏 引用 所屬分類: 網絡編程
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲综合精品一区二区| 欧美成人嫩草网站| 韩日精品视频一区| 亚洲国产综合91精品麻豆| 欧美精品18videos性欧美| 久久成人在线| 欧美国产欧美亚洲国产日韩mv天天看完整 | 精品成人一区二区三区四区| 久久久久亚洲综合| 国产视频亚洲精品| 亚洲美女中文字幕| 久久综合久久88| 欧美激情一区在线| 日韩一级大片| 国产精品激情电影| 欧美亚洲一区二区在线| 久久久久久久精| 亚洲精品社区| 欧美小视频在线观看| 小处雏高清一区二区三区| 亚洲一区在线免费| 欧美日韩精品久久久| 亚洲日韩欧美一区二区在线| 亚洲国产欧美精品| 一本一本久久a久久精品牛牛影视| 久久精品夜色噜噜亚洲aⅴ| 欧美一区在线视频| 尤物99国产成人精品视频| 久久久另类综合| 91久久亚洲| 午夜精品久久久| 国产一区二区欧美| 欧美美女bbbb| 亚洲欧美另类中文字幕| 久久综合久色欧美综合狠狠| 精品999日本| 国产精品美女视频网站| 久久精品噜噜噜成人av农村| 亚洲国产日韩综合一区| 亚洲欧美综合国产精品一区| 在线电影国产精品| 欧美视频在线一区| 欧美成人精品一区二区三区| 亚洲视频在线播放| 亚洲精一区二区三区| 免费在线成人av| 亚洲欧美在线一区| 亚洲另类一区二区| 亚洲第一精品夜夜躁人人爽 | 亚洲欧洲精品一区二区三区不卡 | 国产精品久久久久久av下载红粉| 久久国产精品72免费观看| 宅男在线国产精品| 亚洲伦理在线| 久久精品亚洲热| 国产亚洲欧美在线| 欧美图区在线视频| 国产精品国产三级国产aⅴ浪潮 | 中文一区二区在线观看| 最新日韩在线视频| 亚洲区第一页| 亚洲欧洲在线视频| 99riav1国产精品视频| 中文av一区二区| 亚洲主播在线播放| 香蕉国产精品偷在线观看不卡| 亚洲欧美日韩国产综合在线| 亚洲欧美清纯在线制服| 久久国产乱子精品免费女| 久久伊人免费视频| 欧美激情免费观看| 亚洲免费观看高清完整版在线观看熊 | 久久精品视频在线播放| 久久久久一区二区三区四区| 久久三级视频| 亚洲精品在线一区二区| 午夜精品久久久久久99热软件| 欧美综合第一页| 欧美区国产区| 亚洲电影专区| 欧美在线视频一区二区三区| 亚洲缚视频在线观看| 亚洲专区免费| 欧美日韩一区三区四区| 亚洲国产专区校园欧美| 久久成人资源| 这里只有精品丝袜| 免费在线观看成人av| 国语精品中文字幕| 亚洲欧美日韩精品一区二区 | 亚洲狠狠丁香婷婷综合久久久| 午夜在线视频一区二区区别| 欧美国产日韩一区二区三区| 午夜精品一区二区三区在线| 国产精品第十页| 这里只有精品视频| 99热这里只有成人精品国产| 欧美精品18| 亚洲午夜在线视频| 99国产精品| 国产精品永久免费视频| 亚洲午夜免费视频| 亚洲欧美日韩人成在线播放| 国产精品日本精品| 久久久久久婷| 免费不卡欧美自拍视频| 99视频精品| 亚洲女人天堂av| 亚洲第一偷拍| 日韩午夜免费| 黄色工厂这里只有精品| 嫩模写真一区二区三区三州| 欧美极品aⅴ影院| 欧美有码视频| 欧美激情aⅴ一区二区三区| 亚洲欧美日韩另类| 久久婷婷人人澡人人喊人人爽| 日韩午夜三级在线| 久久av一区二区三区| 正在播放欧美视频| 久久成人免费视频| 亚洲——在线| 欧美~级网站不卡| 久久久久国产成人精品亚洲午夜| 免费观看成人鲁鲁鲁鲁鲁视频| 新67194成人永久网站| 欧美精品在线免费观看| 免费av成人在线| 国产精品一区二区三区四区| 亚洲人体1000| 亚洲免费成人| 欧美日韩精品在线播放| 亚洲国产日韩欧美在线图片| 黄色亚洲在线| 午夜精品一区二区三区电影天堂| 欧美激情在线观看| 欧美v亚洲v综合ⅴ国产v| 国产亚洲成精品久久| 欧美在线视频日韩| 久久精品最新地址| 激情av一区二区| 久久全国免费视频| 亚洲韩日在线| 久久国内精品视频| 国产精品视频精品视频| 久久精品在线视频| 久久久夜精品| 欧美中文字幕| 禁久久精品乱码| 国产精品视频免费观看www| 欧美精品一区二区精品网| 久久亚洲精品一区二区| 久久久一本精品99久久精品66| 亚洲欧美清纯在线制服| 亚洲一区二区精品在线| 亚洲欧洲一级| 久久亚洲精品一区二区| 亚洲伊人观看| 亚洲午夜极品| 一区二区三区免费网站| 一色屋精品视频在线看| 国产精品日本| 国产综合欧美| 国产欧美一区二区精品仙草咪| 欧美久久99| 欧美激情一区二区三区蜜桃视频| 美国成人毛片| 欧美久久久久久蜜桃| 欧美日韩黄色一区二区| 欧美日韩亚洲一区三区| 欧美午夜不卡| 国产女主播一区二区| 国产欧美日韩| 在线精品视频免费观看| 狠狠色综合一区二区| 亚洲国产成人在线| 9久re热视频在线精品| 一区二区三区欧美视频| 亚洲在线观看| 欧美资源在线| 免费精品99久久国产综合精品| 欧美成人激情视频免费观看| 亚洲盗摄视频| 欧美影院在线| 欧美日韩伦理在线免费| 国产精品影音先锋| 国产女优一区| 国产精品99久久久久久久久久久久 | 久久精品国产亚洲5555| 欧美刺激午夜性久久久久久久| 亚洲国产二区| 久久久精品2019中文字幕神马| 久久久噜噜噜久久狠狠50岁| 欧美护士18xxxxhd| 国产私拍一区| 久久精品二区| 欧美亚洲一级| 国产在线高清精品| 欧美专区日韩视频| 午夜精品在线观看|