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

隨筆-250  評論-20  文章-55  trackbacks-0
摘自《Visual C++網絡游戲建模與實現》(蘇羽、王媛媛編著) 
Win32重疊I/O(Overloapped I/O)機制允許發起一個操作,然后在操作完成之后接受
到信息。對于那種需要很長時間才能完成的操作來說,重疊I/O機制尤其有用,因為發起
重疊操作的線程在重疊請求發出后就可以自由地做別的事情了。
    在Windows NT/2000上,提供真正可擴展的I/O模型就是使用完成端口(Completion
Port)的重疊I/O。
    ……
    可以把完成端口看成系統維護的一個隊列,操作系統把重疊I/O操作完成的事件通知
放到該隊列里,由于是暴露“操作完成”的事件通知,所以命名為“完成端口”(Completion
Ports)。一個Socket被創建后,可以在任何時刻和一個完成端口聯系起來。
    一般來說,一個應用程序可以創建多個工作線程來處理完成端口上的通知事件。工作
線程的數量依賴于程序的具體需要。但是在理想的情況下,應該對應一個CPU創建一個線
程。因為在完成端口理想模型中,每個線程都可以從系統獲得一個“原子”性的時間片,輪
番運行并檢查完成端口,線程的切換是額外的開銷。在實際開發的時候,還要考慮這些線
程是否牽涉到其他堵塞操作的情況。如果某線程進行堵塞操作,系統則將其掛起,讓別的
線程獲得運行時間。因此,如果有這樣的情況,可以多創建幾個線程來盡量利用時間。
    應用完成端口分兩步走:
    1. 創建完成端口句柄:
    HANDLE hIocp;
    hIocp=CreateIoCompletionPort(
    INVALID_HANDLE_VALUE,
    NULL,
    (ULONG_PTR)0,
    0);
    if(hIocp==NULL) {
    //如果錯誤
      ……
    }
    注意在第1個參數(FileHandle)傳入INVALID_FILE_HANDLE,第2個參數(ExistingCompletionPort)
傳入NULL,系統將創建一個新的完成端口句柄,沒有任何I/O句柄與其關聯。

    2. 完成端口創建成功后,在Socket和完成端口之間建立關聯。再次調用CreateIoCompletionPort
函數,這一次在第1個參數FileHandle傳入創建的Socket句柄,參數ExistingCompletionPort
為已經創建的完成端口句柄。
    以下代碼創建了一個Socket并把它和完成端口聯系起來。
    SOCKET s;
    s=Socket(AF_INET,SOCK_STREAM,0);
    if(s==INVALID_SOCKET) {
    if(CreateIoCompletionPort((HANDLE)s,
    hIocp,
    (ULONG_PTR)0,
    0)==NULL)
    {
    //如果創建失敗
      ……
    }
    }
    到此為止,Socket已經成功和完成端口相關聯。在此Socket進行的重疊I/O操作結果均
使用完成端口發出通知。

    注意:CreateIoCompletionPort函數的第3個參數允許開發人員傳入一個類型為ULONG_PTR
的數據成員,我們把它稱為完成鍵(Completion Key),此數據成員可以設計為指向包含Socket
信息的一個結構體的一個指針,用來把相關的環境信息和Socket聯系起來,每次完成通知來
到的同時,該環境信息也隨著通知一起返回給開發人員。

    完成端口創建以及與Socket關聯之后,就要創建一個或多個工作線程來處理完成通知,
每個線程都可以循環地調用GetQueuedCompletionStatus函數,檢查完成端口上的通知事件。
    在舉例說明一個典型的工作線程之前,我們先討論一下重疊I/O的過程。到一個重疊I/O
被發起,一個Overlapped結構體的指針就要作為參數傳遞給系統。當操作完成時,
GetQueueCompletionStatus就可以返回指向同一個Overlapped結構的指針。為了辨認和定位
這個已完成的操作,開發人員最好定義自己的OVERLAPPED結構,以包含一些自己定義的關于
操作本身的額外信息。比如:
    typedef struct _OVERLAPPELUS {
      OVERLAPPED ol;
      SOCKET s, sclient;
      int OpCode;
      WSABUF wbuf;
      DWORD dwBytes, dwFlags;
    } OVERLAPPELUS;
    此結構的第1個成員為默認的OVERLAPPED結構,第2和第3個為本地服務Socket和與該
操作相關的客戶socket,第4個成員為操作類型,對于Socket,現在定義的有以下3種:
    #define OP_READ 0
    #define OP_WRITE 1
    #define OP_ACCEPT 2
    然后還有應用程序的Socket緩沖區,操作數據量,標志位以及其他開發人員認為有用
的信息。
    當進行重疊I/O操作,把OVERLAPPELUS結構作為重疊I/O的參數lpOverlapp傳遞(如
WSASend,WASRecv,等函數的lpOverlapped參數,要求傳入一個OVERLAPP結構的指針)。
    當操作完成后,GetQueuedCompletionStatus函數返回一個LPOVERLAPPED類型的指針,
這個指針其實是指向開發人員定義的擴展OVERLAPPELUS結構,包含著開發人員早先傳入的
全部信息。

    注意:OVERLAPPED成員不一定要求是OVERLAPPELUS擴展結構的一個成員,在獲得
OVERLAPPED指針之后,可以用CONTAINING_RECORD宏獲得相應的擴展結構的指針。

    典型的Worker Thread結構:
    DWORD WINAPI WorkerThread(LPVOID lpParam)
    {
      ULONG_PTR *PerHandleKey;
      OVERLAPPED *Overlap;
      OVERLAPPELUS *OverlapPlus, *newolp;
      DWORD dwBytesXfered;
     
      while(1)
      {
        ret=GetQueuedCompletionStatus(
        hIocp,
        &dwBytesXfered,
        (PULONG_PTR)&PerHandleKey,
        &Overlap,
        INFINITE);
        if(ret==0)
        {
          //如果操作失敗
          continue;
        }
       
        OverlapPlus=CONTATING_RECORD(Overlap, OVERLAPPELUS, ol);
        switch(OverlapPlus->OpCode)
        {
          case OP_ACCEPT:
            CreateIoCompletionPort(
                (HANDLE)OverlapPlus->sclient,
                hIocp,
                (ULONG_PTR)0,
                0);
            newolp=AllocateOverlappelus();
            newolp->s=OverlapPlus->sclient;
            newolp->OpCode=OP_READ;
            PrepareSendBuffer(&newolp->wbuf);
            ret=WSASend(
              newolp->s,
              &newolp->wbuf,
              1,
              &newolp->dwBytes,
              0,
              &newolp.ol,
              NULL);
            if(ret==SOCKET_ERROR)
            {
              if(WSAGetLastError()!=WSA_IO_PENDING)
              {
                //進行錯誤處理
                ……
              }
            }
            FreeOverlappelus(OverlapPlus);
            SetEvent(hAcceptThread);
            break;
          case OP_READ:
            memset(&OverlapPlus->ol,0,sizeof(OVERLAPPED));
            ret=WSARecv(
                OverlapPlus->s,
                &OverlapPlus->wbuf,
                1,
                &OverlapPlus->dwBytes,
                &OverlapPlus->dwFlags,
                &OverlapPlus->ol,
                NULL);
            if(ret==SOCKET_ERROR)
            {
              if(WSAGetLastError()!=WSA_IO_PENDING)
              {
                //錯誤處理
                ……
              }
            }
            break;
          case OP_WRITE:
            break;
        }/*switch結束*/
      }/*while結束*/
    }/*WorkerThread結束*/
   
    注意:如果Overlapped操作立刻失?。ū热?,返回SOCKET_ERROR或其他非
    WSA_IO_PENDING的錯誤),則沒有任何完成通知事件會被放到完成端口隊列里。反之,
    則一定有相應的通知事件被放到端口隊列。

posted on 2007-04-28 17:14 jay 閱讀(687) 評論(0)  編輯 收藏 引用 所屬分類: socket
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            蘑菇福利视频一区播放| 亚洲精品一区二区三区不| 亚洲精品乱码久久久久久日本蜜臀| 羞羞答答国产精品www一本| 亚洲国产裸拍裸体视频在线观看乱了中文| 亚洲精品免费电影| 国产精品夜夜夜| 久久亚洲不卡| 欧美日韩综合不卡| 欧美中文字幕精品| 欧美99在线视频观看| 欧美一区三区三区高中清蜜桃| 久久一区亚洲| 亚洲欧美日韩国产成人| 久久免费国产| 欧美精品入口| 欧美在线观看天堂一区二区三区 | 欧美日韩国产999| 欧美影院在线| 久久久99国产精品免费| 亚洲无人区一区| 久久综合九色综合网站| 欧美一区二区三区播放老司机 | 久久国产黑丝| 欧美三区在线视频| 亚洲国产综合视频在线观看| 国模套图日韩精品一区二区| 亚洲视频在线一区观看| 亚洲人成网站精品片在线观看| 午夜精品在线| 亚洲欧美99| 欧美日韩综合| 亚洲毛片一区| 一区二区久久久久久| 欧美电影免费观看高清完整版| 久久综合激情| 国产在线拍偷自揄拍精品| 亚洲视频欧美视频| 亚洲永久免费观看| 欧美日韩在线第一页| 亚洲福利视频一区二区| 影音先锋久久久| 久久福利电影| 久久久久www| 欧美日韩麻豆| 亚洲国产小视频在线观看| 欧美精品三区| 亚洲精品人人| 亚洲日本中文字幕| 欧美在线观看www| 亚洲欧美另类综合偷拍| 欧美国产视频日韩| 欧美一二三区精品| 国产日韩欧美夫妻视频在线观看| 亚洲精品一区二区在线| 亚洲日本激情| 欧美日韩国产精品| 亚洲精品一区二区三区福利| 亚洲图片在线| 欧美日韩国产美| 亚洲另类视频| 欧美精品一区在线发布| 乱人伦精品视频在线观看| 黄色国产精品| 亚洲欧美日本日韩| 久久精品中文字幕免费mv| 亚洲一级免费视频| 一区二区毛片| 国产精品少妇自拍| 亚洲视频在线观看三级| 久久九九免费视频| 国产性做久久久久久| 亚洲一区二区三区在线播放| 欧美精品三区| 午夜精品福利在线观看| 欧美一区二区三区在线| 国产精品久久久久久久久| 日韩香蕉视频| 亚洲一区二区3| 国产精品视频不卡| 亚洲综合日韩中文字幕v在线| 欧美一区二区三区免费看| 蜜臀va亚洲va欧美va天堂| 亚洲电影视频在线| 91久久中文字幕| 欧美日本成人| 亚洲视频在线观看三级| 欧美中文字幕精品| 一区二区三区在线看| 免费成人黄色av| 最新国产精品拍自在线播放| 亚洲天堂成人在线观看| 国产精品第三页| 欧美一区二区视频免费观看| 久久久久久久999精品视频| 亚洲国产欧美久久| 欧美日韩国产成人在线| 亚洲欧美日韩中文视频| 亚洲三级影院| 欧美在线精品免播放器视频| 精品不卡一区二区三区| 久久精品国产成人| 久久久久久夜| 在线观看欧美日韩国产| 久久午夜视频| 夜夜嗨av色一区二区不卡| 久久成人免费日本黄色| 亚洲国产人成综合网站| 免费看成人av| 久久国产精品亚洲va麻豆| 亚洲国产高潮在线观看| 亚洲一级特黄| 欧美性开放视频| 欧美高清在线| 日韩系列欧美系列| 亚洲国产综合在线| 亚洲男人影院| 99视频在线观看一区三区| 麻豆亚洲精品| 久久久999精品免费| 欧美国产日韩一区| 久久综合久久88| 一本一道久久综合狠狠老精东影业| 在线观看国产欧美| 欧美xart系列高清| 玖玖在线精品| 午夜精品婷婷| 亚洲欧美在线观看| 影音先锋久久| 影音国产精品| 国产九色精品成人porny| 欧美国产精品久久| 亚洲午夜黄色| 亚洲免费中文字幕| 亚洲精品少妇| 欧美激情第8页| 久久久久国产精品麻豆ai换脸| 亚洲毛片一区二区| 久久免费黄色| 妖精成人www高清在线观看| 国产一区自拍视频| 欧美人妖另类| 欧美视频在线一区| 欧美夫妇交换俱乐部在线观看| 欧美永久精品| 亚洲欧美成人精品| 亚洲精品影院| 最新日韩在线| 欧美国产日韩一二三区| 久久综合一区二区| 久久久久久久久久久久久女国产乱| 亚洲免费伊人电影在线观看av| 亚洲精品国产品国语在线app| 国产精品一区二区视频| 韩国三级在线一区| 国产午夜精品一区二区三区视频| 国产精品美女在线| 国产精品成人一区二区三区夜夜夜| 欧美日韩国产一区二区三区地区 | 亚洲免费观看高清完整版在线观看| 国产喷白浆一区二区三区| 欧美激情国产高清| 欧美午夜精品久久久久免费视| 欧美激情一区二区在线| 欧美国产日韩精品| 欧美jizz19性欧美| 欧美顶级艳妇交换群宴| 欧美精品在线播放| 欧美国产日产韩国视频| 欧美久久久久久| 欧美日韩国产bt| 欧美性色综合| 国产日韩欧美制服另类| 精品不卡视频| 亚洲日本激情| 久久av一区| 久久亚洲欧洲| 99精品视频免费观看| 亚洲系列中文字幕| 久久乐国产精品| 久久精品亚洲一区二区| 欧美连裤袜在线视频| 亚洲欧美国产va在线影院| 久久精品在线| 欧美性感一类影片在线播放| 国产手机视频一区二区| 亚洲欧洲精品成人久久奇米网| 一本色道久久加勒比88综合| 久久久久九九视频| 亚洲国产91色在线| 午夜日韩在线观看| 久久久久久国产精品一区| 亚洲欧洲在线看| 亚洲视屏一区| 久久久天天操| 欧美色视频在线| 欧美先锋影音| 日韩亚洲一区二区| 午夜国产一区| 欧美激情在线观看|