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

kenlistian

厚積薄發(fā). 勤為槳,思為帆

   :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理 ::
  73 隨筆 :: 4 文章 :: 22 評(píng)論 :: 0 Trackbacks

     在網(wǎng)絡(luò)通訊中,由于網(wǎng)絡(luò)擁擠或一次發(fā)送的數(shù)據(jù)量過大等原因,經(jīng)常會(huì)發(fā)生交換的數(shù)據(jù)在短時(shí)間內(nèi)不能傳送完,收發(fā)數(shù)據(jù)的函數(shù)因此不能返回,這種現(xiàn)象叫做阻塞。 Winsock對(duì)有可能阻塞的函數(shù)提供了兩種處理方式:阻塞和非阻塞方式。

阻塞模式

     在阻塞方式下,收發(fā)數(shù)據(jù)的函數(shù)在被調(diào)用后一直要到傳送完畢或者出錯(cuò)才能返回。在阻塞期間,被阻的函數(shù)不會(huì)斷調(diào)用系統(tǒng)函數(shù)GetMessage()來保持消息循環(huán)的正常進(jìn)行。

非阻塞模式
        將一個(gè)套接字置為非阻塞模式之后, Winsock API調(diào)用會(huì)立即返回。一般這些調(diào)用都會(huì)“失敗”,并返回一個(gè)WSAEWOULDBLOCK。表明其操作在調(diào)用期間沒有時(shí)間完成。如在系統(tǒng)的輸入緩沖區(qū)中,并不存在等待的數(shù)據(jù),那recv調(diào)用就會(huì)返回WSAEWOULDBLOCK錯(cuò)誤。通常,我們需要重復(fù)調(diào)用同一個(gè)函數(shù),直至獲得一個(gè)成功返回代碼。這不是一個(gè)好的方法。通常采用Winsock的套接字I/O模型去處理。

套接字I/O模型共有五種類型,如下:

  select(選擇) 
  WSAAsyncSelect(異步選擇)
  WSAEventSelect(事件選擇)
  overlapped(重疊)
  completion port(完成端口)

 

*WSAAsyncSelect

      Winsock通過WSAAsyncSelect()自動(dòng)地設(shè)置套接字處于非阻塞方式。使用WindowsSockets實(shí)現(xiàn)Windows網(wǎng)絡(luò)程序設(shè)計(jì)的關(guān)鍵就是它提供了對(duì)網(wǎng)絡(luò)事件基于消息的異步存取,用于注冊應(yīng)用程序感興趣的網(wǎng)絡(luò)事件。它請求Windows Sockets DLL在檢測到套接字上發(fā)生的網(wǎng)絡(luò)事件時(shí),向窗口發(fā)送一個(gè)消息。

 int PASCAL FAR WSAAsyncSelect(SOCKET s,HWND hWnd,unsigned int wMsg,long lEvent);
hWnd:窗口句柄
wMsg:需要發(fā)送的消息
lEvent:事件(以下為事件的內(nèi)容)
值: 含義:
FD_READ 期望在套接字上收到數(shù)據(jù)(即讀準(zhǔn)備好)時(shí)接到通知
FD_WRITE 期望在套接字上可發(fā)送數(shù)據(jù)(即寫準(zhǔn)備好)時(shí)接到通知
FD_OOB 期望在套接字上有帶外數(shù)據(jù)到達(dá)時(shí)接到通知
FD_ACCEPT 期望在套接字上有外來連接時(shí)接到通知
FD_CONNECT 期望在套接字連接建立完成時(shí)接到通知
FD_CLOSE 期望在套接字關(guān)閉時(shí)接到通知

       進(jìn)行異步選擇使用WSAAsyncSelect()函數(shù)時(shí),有以下幾點(diǎn)需要引起特別的注意:
  .連續(xù)使用兩次WSAAsyncSelect()函數(shù)時(shí),只有第二次設(shè)置的事件有效,如:
           WSAAsyncSelect(s,hwnd,wMsg1,FD_READ);
           WSAAsyncSelect(s,hwnd,wMsg2,FD_CLOSE);
        這樣只有當(dāng)FD_CLOSE事件發(fā)生時(shí)才會(huì)發(fā)送wMsg2消息。
  .可以在設(shè)置過異步選擇后通過再次調(diào)用WSAAsyncSelect(s,hwnd,0,0);的形式取消在套接字上所設(shè)置的異步事件。
  .Windows Sockets DLL在一個(gè)網(wǎng)絡(luò)事件發(fā)生后,通常只會(huì)給相應(yīng)的應(yīng)用程序發(fā)送一個(gè)消息,而不能發(fā)送多個(gè)消息。但通過使用一些函數(shù)隱式地允許重發(fā)此事件的消息,這樣就可能再次接收到相應(yīng)的消息。
  .在調(diào)用過closesocket()函數(shù)關(guān)閉套接字之后不會(huì)再發(fā)生FD_CLOSE事件。


     對(duì)UDP協(xié)議,這些網(wǎng)絡(luò)事件主要為:
      FD_READ   期望在套接字收到數(shù)據(jù)(即讀準(zhǔn)備好)時(shí)接收通知;
      FD_WRITE 期望在套接字可發(fā)送數(shù)(即寫準(zhǔn)備好)時(shí)接收通知;
    FD_CLOSE 期望在套接字關(guān)閉時(shí)接電通知
  消息變量wParam指示發(fā)生網(wǎng)絡(luò)事件的套接字,變量1Param的低字節(jié)描述發(fā)生的網(wǎng)絡(luò)事件,高字包含錯(cuò)誤碼。如在窗口函數(shù)的消息循環(huán)中均加一個(gè)分支:
int ok=sizeof(SOCKADDR);
case wMsg;
switch(1Param)
{
    case FD_READ:  //套接字上讀數(shù)據(jù) 
    if(recvfrom(sr.lpPlayData[j],dwDataSize,0,(struct sockaddr FAR*)&there1,
     (int FAR*)&ok)==SOCKET_ERROR0) {
                MessageBox(hwnd,“數(shù)據(jù)接收失敗!”,“”,MB_OK);
                return(FALSE);
       }
    case FD_WRITE:    //套接字上寫數(shù)據(jù)
  }
break;

 

 

*WSAEventSelect
      事件通知模型要求在程序中針對(duì)使用的每個(gè)套接字創(chuàng)建一個(gè)事件對(duì)象,然后通過事件模式通知程序其套接字是否收到或發(fā)送的信息。一般來說這種模式,一般就是通過類似調(diào)用waitformultipleObject一樣在一個(gè)線程中等待信號(hào)事件來,來了就處理。具體調(diào)用的函數(shù)如下:

    創(chuàng)建WSACreateEvent函數(shù).該函數(shù)的返回值是一個(gè)創(chuàng)建好的事件對(duì)象句柄。事件對(duì)象句柄完后,接下來將其與某個(gè)套接字關(guān)聯(lián)在一起,同時(shí)注冊自己感興趣的網(wǎng)絡(luò)事件類型,方法是調(diào)用WSAEventSelect函數(shù),對(duì)它的定義如下:

   int WSAEventSelect (
              SOCKET s,                              //需要非阻塞處理的套接字
              WSAEVENT hEventObject,    //WSACreateEvent 創(chuàng)建來的,關(guān)聯(lián)到socket
              long lNetworkEvents     
               );
    lNetworkEvents,對(duì)應(yīng)一個(gè)“位掩碼”,用于指定應(yīng)用程序感興趣的各種網(wǎng)絡(luò)事件類型的一個(gè)組合。要想獲知對(duì)這些事件類型的詳細(xì)說明,請參考早先討論過的WSAAsyncSelect I/O模型。
      為WSAEventSelect創(chuàng)建的事件擁有兩種工作狀態(tài),以及兩種工作模式。
    兩種工作狀態(tài)分別是“已傳信”(signaled)和 “未傳信”(nonsignaled)。
    工作模式則包括“人工”(manual reset)和“自動(dòng)”(auto reset)。
      

      WSACreateEvent缺省時(shí)其信號(hào)狀態(tài)為0,且為人工設(shè)置,當(dāng)網(wǎng)絡(luò)事件觸發(fā)了與一個(gè)套接字關(guān)聯(lián)在一起的事件對(duì)象,其事件信號(hào)置1。在完成了一個(gè)I/O請求的處理之后,需要調(diào)用WSAResetEvent復(fù)位處理(置信號(hào)為0)。
     一個(gè)套接字同一個(gè)事件對(duì)象句柄關(guān)聯(lián)在一起后,應(yīng)用程序便可開始I/O處理;方法是等待網(wǎng)絡(luò)事件觸發(fā)事件對(duì)象句柄的工作狀態(tài)。
     一般而言,在等待網(wǎng)絡(luò)傳來事件時(shí),類似WaitforMultipleObject,其WSAWaitForMultipleEvents函數(shù)的設(shè)計(jì)宗旨便是用來等待一個(gè)或多個(gè)事件對(duì)象句柄,并在事先指定的一個(gè)或所有句柄進(jìn)入有信號(hào)狀態(tài)后,或在超過了一個(gè)規(guī)定的時(shí)間周期后,立即返回(線程往往在這里死等)。

   下面是 WSAWaitForMultipleEvents函數(shù)的定義:
DWORD WSAWaitForMultipleEvents(
  DWORD cEvents,                 
  const WSAEVENT FAR *lphEvents
  BOOL fWaitAll,                 
  DWORD dwTimeOUT,               
  BOOL fAlertable                
);

其用法和WaitForMultipleObject類似。
cEvents和lphEvents參數(shù)定義了由WSAEVENT對(duì)象構(gòu)成的一個(gè)數(shù)組。在這個(gè)數(shù)組中,cEvents指定的是事件對(duì)象的數(shù)量,而lphEvents對(duì)應(yīng)的是一個(gè)指針,用于直接引用該數(shù)組。
     要注意的是, WSAWaitForMultipleEvents只能支持由WSA_MAXIMUM_WAIT_EVENTS對(duì)象規(guī)定的一個(gè)最大值,在此定義成64個(gè)。故該I/O模型一次最多都只能支持64個(gè)套接字。假如想讓這個(gè)模型同時(shí)管理不止64個(gè)套接字,必須創(chuàng)建更多的工作者線程,以便等待更多的事件對(duì)象。

fWaitAl l 參數(shù)指定了WSAWaitForMultiple Events如何等待在事件數(shù)組中的對(duì)象。
   =TRUE,那么只有等lphEvents數(shù)組內(nèi)包含的所有事件對(duì)象都處于有信號(hào)狀態(tài),函數(shù)才會(huì)返回;

   =FALSE,任一個(gè)事件對(duì)象進(jìn)入有信號(hào)時(shí),函數(shù)就會(huì)返回。

 dwTimeout參數(shù)規(guī)定了 WSAWaitForMultipleEvents最多可等待一個(gè)網(wǎng)絡(luò)事件發(fā)生有多長時(shí)間。超過規(guī)定的時(shí)間,函數(shù)就會(huì)立即返回。并返回WSA_WAIT_TIMEOUT。如dwsTimeout設(shè)為WSA_INFIN ITE(永遠(yuǎn)等待),那么根據(jù)fWaiiAll或等待一個(gè)網(wǎng)絡(luò)事件或所有網(wǎng)絡(luò)事件都傳信號(hào)后,才能從該函數(shù)退出。
 fAlertable,缺省設(shè)為FALSE。主要用于在重疊式I/O模型中.

  當(dāng)設(shè)置fWaiAll=false,WaitForMultipleObject再有網(wǎng)絡(luò)事件時(shí),會(huì)返回一個(gè)值,指出造成函數(shù)返回的事件對(duì)象。根據(jù)WSAWaitForMultipleEvents的返回值,減去預(yù)定義值WSA_WAIT_EVENT_0,得到具體的引用值(即索引位置),程序便可用事件數(shù)組中已發(fā)信號(hào)的事件,檢索與那個(gè)事件對(duì)應(yīng)的套接字,知道了造成網(wǎng)絡(luò)事件的套接字后,調(diào)用 WSAEnumNetworkEvents函數(shù),調(diào)查發(fā)生了什么類型的網(wǎng)絡(luò)事件。該函數(shù)定義如下:
int WSAEnumNetworkEvents (
  SOCKET s,                                      //檢索該套接字
  WSAEVENT hEventObject,             
  LPWSANETWORKEVENTS lpNetworkEvents 
);
    hEventObject參數(shù)則是可選的;它指定了一個(gè)事件句柄,對(duì)應(yīng)于打算重設(shè)的那個(gè)事件對(duì)象。由于我們的事件對(duì)象處在一個(gè)有信號(hào)狀態(tài),所以可將它傳入,令其自動(dòng)成為無信號(hào)狀態(tài)。
    也可以采用使用 WSAResetEvent 函數(shù)復(fù)位事件信號(hào)。
   lpNetworkEvents,就是返回的結(jié)果信息,它是一個(gè)指向WSANETWORKEVENTS結(jié)構(gòu)的指針,用于接收套接字上發(fā)生的網(wǎng)絡(luò)事件類型以及可能出現(xiàn)的任何錯(cuò)誤代碼。

其WSANETWORKEVENTS結(jié)構(gòu)的定義:
typedef struct _WSANETWORKEVENTS
{
     long lNetworkEvents;
     int iErrorCode[FD_MAX_EVENTS];
} WSANETWORKEVENTS, FAR * LPWSANETWORKEVENTS;
lNetworkEvents參數(shù)指定了一個(gè)值,對(duì)應(yīng)于套接字上發(fā)生的所有網(wǎng)絡(luò)事件類型。
      注意一個(gè)事件進(jìn)入置1(有信號(hào))狀態(tài)時(shí),可能會(huì)同時(shí)發(fā)生多個(gè)網(wǎng)絡(luò)事件類型。如,一個(gè)忙的服務(wù)器可能同時(shí)收到FD_READ和FD_WRITE通知。 iErrorCode參數(shù)指定的是一個(gè)錯(cuò)誤代碼數(shù)組,同lNetworkEvents中的事件關(guān)聯(lián)在一起。針對(duì)每個(gè)網(wǎng)絡(luò)事件類型,都存在著一個(gè)特殊的事件索引,名字與事件類型的名字類似,只是要在事件名字后面添加一個(gè)“ _BIT”后綴字串即可。如,對(duì)FD_READ事件類型來說,iErrorCode數(shù)組的索引標(biāo)識(shí)符便是FD_READ_BIT。

posted on 2007-12-27 18:01 kenlistian 閱讀(6653) 評(píng)論(1)  編輯 收藏 引用

評(píng)論

# re: socket異步筆記 2008-09-04 10:21 david.hu
很不錯(cuò).寫的很清楚
"FD_READ 期望在套接字上收到數(shù)據(jù)(即讀準(zhǔn)備好)時(shí)接到通知 "~~

比msdn 都清楚  回復(fù)  更多評(píng)論
  


只有注冊用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美日韩国产综合| 尤妮丝一区二区裸体视频| 亚洲欧美欧美一区二区三区| 日韩视频不卡| 一区二区三区成人精品| 亚洲美女av黄| 亚洲在线日韩| 国产精品无码专区在线观看| 久久精品成人| 久久美女性网| 你懂的亚洲视频| 日韩天堂av| 午夜一区在线| 欧美a级片网站| 欧美丝袜第一区| 国产午夜精品一区二区三区视频| 国产午夜精品一区二区三区欧美| 亚洲国产日韩在线| 午夜亚洲视频| 欧美好骚综合网| 亚洲一二三级电影| 久久成人这里只有精品| 欧美大片在线看| 国产欧美一区二区精品性色| 亚洲国产精品一区二区尤物区 | 日韩午夜黄色| 久久国产精品99国产| 欧美日韩一区二区三区免费看| 国产欧美丝祙| 夜夜爽夜夜爽精品视频| 久久久久久久性| 一本一本久久a久久精品综合麻豆| 久久精品国产综合精品| 国产精品久久久久久久7电影| 在线精品视频一区二区| 亚洲欧美日本日韩| 欧美成人激情视频免费观看| 亚洲香蕉视频| 欧美日韩一区在线| 亚洲精品小视频| 麻豆国产精品777777在线| 亚洲午夜久久久久久尤物| 欧美黑人在线播放| 在线看视频不卡| 久久久久久久国产| 亚洲一区二区三区免费在线观看| 欧美激情第3页| 欧美大片一区二区| 亚洲激情自拍| 久久国产免费| 国产精品亚洲欧美| 亚洲一区国产| 一本久道综合久久精品| 欧美日韩国内自拍| 日韩网站在线看片你懂的| 欧美黄色片免费观看| 久久一区二区三区四区五区| 国内精品一区二区| 久久综合国产精品台湾中文娱乐网| 午夜精品福利视频| 国产日韩欧美成人| 久久亚洲综合色| 久久久噜噜噜久久中文字免| 极品尤物av久久免费看| 久久综合婷婷| 久久婷婷一区| 亚洲欧洲在线一区| 亚洲精品在线视频观看| 欧美日韩视频一区二区三区| 亚洲视频999| 中日韩视频在线观看| 国产精品乱码久久久久久| 欧美一区二区三区在| 性久久久久久久| 精品二区视频| 亚洲国产精品久久久| 欧美日韩性生活视频| 午夜欧美大片免费观看| 欧美淫片网站| 亚洲精品国产精品国自产观看浪潮 | 欧美国产在线观看| 欧美国产日韩一区二区在线观看| 亚洲免费观看高清在线观看| 一本久道久久综合中文字幕| 国产麻豆精品theporn| 久久久亚洲影院你懂的| 免费不卡欧美自拍视频| 亚洲一区二区三区四区中文 | 欧美久久视频| 亚洲一区制服诱惑| 欧美在线观看视频一区二区| 亚洲国产一区在线观看| 一本在线高清不卡dvd| 国产亚洲aⅴaaaaaa毛片| 欧美激情va永久在线播放| 国产精品成人免费| 欧美成人综合| 国产日产精品一区二区三区四区的观看方式 | 午夜久久99| 亚洲第一在线综合网站| 亚洲毛片一区| 在线成人激情黄色| 亚洲深夜av| 亚洲欧洲一区二区三区在线观看| 一本色道久久综合亚洲精品高清| 一区精品在线| 亚洲永久精品国产| 日韩视频在线观看| 久久久久亚洲综合| 欧美一级大片在线观看| 欧美激情亚洲自拍| 玖玖国产精品视频| 国产精品视频网站| 亚洲精品亚洲人成人网| 伊人婷婷久久| 欧美一区二区三区久久精品茉莉花| 亚洲激情校园春色| 欧美综合二区| 欧美一区二区精美| 欧美日韩在线视频观看| 欧美二区在线观看| 黄色日韩网站| 校园春色国产精品| 午夜久久tv| 国产精品老女人精品视频| 91久久综合| 亚洲高清视频在线观看| 久久成人人人人精品欧| 久久久久久97三级| 国产偷久久久精品专区| 夜夜嗨av一区二区三区中文字幕| 亚洲人成人一区二区在线观看| 久久精品国内一区二区三区| 久久久久久久成人| 狠狠88综合久久久久综合网| 香蕉久久夜色精品国产使用方法| 午夜视频一区二区| 国产欧美日韩精品专区| 亚洲欧美日韩国产一区| 欧美一区三区二区在线观看| 国产精品日韩一区二区| 亚洲一区二区在线播放| 欧美一级久久久| 国产一二精品视频| 久久久久国内| 亚洲国产欧美在线人成| 日韩午夜在线播放| 欧美日韩网站| 亚洲自啪免费| 老司机久久99久久精品播放免费| 在线日韩中文字幕| 欧美激情欧美激情在线五月| 99re热这里只有精品免费视频| 亚洲一区二区成人| 国产日韩欧美综合一区| 久久精品综合| 亚洲欧洲日本专区| 午夜国产一区| 一区二区三区在线不卡| 欧美高清一区二区| 亚洲一区二区在线看| 老司机一区二区三区| 亚洲东热激情| 国模吧视频一区| 免费成人性网站| 亚洲精品永久免费| 欧美一区二区三区在线观看视频| 黄色在线一区| 欧美伦理一区二区| 亚洲欧美福利一区二区| 麻豆freexxxx性91精品| 在线午夜精品| 国产一区三区三区| 欧美日韩不卡| 久久精品一区二区三区不卡| 亚洲日本中文字幕区| 欧美亚洲午夜视频在线观看| 最新成人在线| 国产午夜精品久久久| 欧美精品一区在线| 久久久久久999| 国产精品99久久久久久久vr| 欧美福利一区二区| 久久福利电影| 亚洲一区二区在线免费观看视频| 亚洲国产国产亚洲一二三| 国产精品青草综合久久久久99 | 久久av资源网站| 99视频精品| 亚洲黄色尤物视频| 麻豆精品在线观看| 久久国产精彩视频| 亚洲综合清纯丝袜自拍| 亚洲另类在线视频| 亚洲国产欧美另类丝袜| 国产一区二区三区丝袜| 国产精品乱码妇女bbbb| 欧美日本韩国| 欧美成人亚洲| 久久久久久色|