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

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

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

    注意:CreateIoCompletionPort函數(shù)的第3個(gè)參數(shù)允許開(kāi)發(fā)人員傳入一個(gè)類型為ULONG_PTR
的數(shù)據(jù)成員,我們把它稱為完成鍵(Completion Key),此數(shù)據(jù)成員可以設(shè)計(jì)為指向包含Socket
信息的一個(gè)結(jié)構(gòu)體的一個(gè)指針,用來(lái)把相關(guān)的環(huán)境信息和Socket聯(lián)系起來(lái),每次完成通知來(lái)
到的同時(shí),該環(huán)境信息也隨著通知一起返回給開(kāi)發(fā)人員。

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

    注意:OVERLAPPED成員不一定要求是OVERLAPPELUS擴(kuò)展結(jié)構(gòu)的一個(gè)成員,在獲得
OVERLAPPED指針之后,可以用CONTAINING_RECORD宏獲得相應(yīng)的擴(kuò)展結(jié)構(gòu)的指針。

    典型的Worker Thread結(jié)構(gòu):
    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)
              {
                //進(jìn)行錯(cuò)誤處理
                ……
              }
            }
            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)
              {
                //錯(cuò)誤處理
                ……
              }
            }
            break;
          case OP_WRITE:
            break;
        }/*switch結(jié)束*/
      }/*while結(jié)束*/
    }/*WorkerThread結(jié)束*/
   
    注意:如果Overlapped操作立刻失敗(比如,返回SOCKET_ERROR或其他非
    WSA_IO_PENDING的錯(cuò)誤),則沒(méi)有任何完成通知事件會(huì)被放到完成端口隊(duì)列里。反之,
    則一定有相應(yīng)的通知事件被放到端口隊(duì)列。

posted on 2007-04-28 17:14 jay 閱讀(687) 評(píng)論(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>
            亚洲综合日韩| 欧美精品色一区二区三区| 亚洲影院一区| 久久久久久久一区二区| 欧美专区第一页| 久久久一本精品99久久精品66| 香蕉久久久久久久av网站| 亚洲欧美激情在线视频| 亚洲欧美日韩天堂| 亚洲人成7777| 亚洲新中文字幕| 亚洲一品av免费观看| 欧美成年人网| 日韩一级片网址| 亚洲一区视频在线| 久久久美女艺术照精彩视频福利播放| 久久综合久久久| 欧美午夜性色大片在线观看| 国产美女精品视频免费观看| 毛片一区二区| 久久久久久久久久码影片| 亚洲高清成人| 一区二区三区精品久久久| 欧美一区视频| 欧美日韩xxxxx| 国产一区二区三区免费观看| 日韩亚洲精品电影| 久久久视频精品| 久久国产乱子精品免费女| 欧美日韩国产丝袜另类| 一区二区三区视频在线播放| 免费久久99精品国产| 中文国产一区| 你懂的视频一区二区| 国产日韩欧美在线播放不卡| 99热这里只有精品8| 久久这里只有| 亚洲一区二区在| 国产午夜精品麻豆| 欧美阿v一级看视频| 欧美久久视频| 亚洲人成啪啪网站| 久久免费精品视频| 免费日韩成人| 亚洲欧美日韩综合| 91久久久国产精品| 久久久九九九九| 国产人成一区二区三区影院| 亚洲私人影吧| 亚洲精品在线观| 欧美成人综合网站| 亚洲国产第一| 老司机精品视频网站| 欧美岛国在线观看| 欧美一级电影久久| 欧美成人一区在线| 久久久国产精彩视频美女艺术照福利| 欧美暴力喷水在线| 久久激情五月婷婷| 欧美一区二区在线播放| 亚洲日本欧美日韩高观看| 欧美α欧美αv大片| 国产精品久久久久久户外露出 | 永久免费视频成人| 美女网站在线免费欧美精品| 欧美乱妇高清无乱码| 久久久久久精| 国产精品乱人伦中文| 欧美在线一级视频| 欧美日韩国产va另类| 美女视频黄免费的久久| 国产精品日韩在线一区| 久久成人18免费观看| 欧美激情欧美狂野欧美精品| 久久精品国产免费观看| 欧美系列电影免费观看| 亚洲国产精品久久久久秋霞蜜臀 | 在线看视频不卡| 亚洲精品在线二区| 欧美在线观看一区二区| 性刺激综合网| 狠狠色丁香久久综合频道| 麻豆成人在线观看| 国产女人精品视频| 中文av字幕一区| 亚洲午夜在线观看视频在线| 久久一综合视频| 亚洲欧洲日韩综合二区| 性久久久久久久久| 性欧美超级视频| 国产精品高精视频免费| 亚洲高清久久久| 亚洲激情影院| 亚洲天堂偷拍| 伊人久久亚洲热| 午夜精品国产| 亚洲美洲欧洲综合国产一区| 在线亚洲伦理| 亚洲私人黄色宅男| 欧美三级乱人伦电影| 久久精品国产亚洲一区二区| 国产精品免费一区豆花| 亚洲综合国产精品| 亚洲黄色视屏| 欧美大片在线观看一区二区| 欧美大香线蕉线伊人久久国产精品| 欧美日本中文字幕| 亚洲国产精品美女| 亚洲精品免费在线观看| 欧美高清影院| 久久青草欧美一区二区三区| 国产亚洲激情在线| 欧美在线一二三四区| 一区二区黄色| 国产精品二区在线| 欧美亚洲一区二区三区| 免费不卡在线观看| 亚洲精品乱码| 国产精品视频xxxx| 久久久久久久久岛国免费| 亚洲国产日韩一区二区| 日韩午夜精品| 国产九九精品| 免费看的黄色欧美网站| 一本色道久久综合狠狠躁篇怎么玩| 午夜精品国产更新| 亚洲国产精品成人综合色在线婷婷| 欧美精品九九99久久| 亚洲欧美国产77777| 亚洲成色999久久网站| 在线观看一区二区视频| 欧美日韩高清在线观看| 亚洲欧美综合另类中字| 亚洲电影在线免费观看| 亚洲一区高清| 亚洲欧洲一区二区三区久久| 欧美先锋影音| 蜜桃av综合| 欧美激情第8页| 亚洲国产精品综合| 国产精品久久福利| 欧美阿v一级看视频| 欧美与欧洲交xxxx免费观看| 亚洲精品看片| 欧美成人免费全部| 久久不射中文字幕| 在线视频欧美精品| 在线成人欧美| 亚洲精选久久| 亚洲精品久久久久久下一站 | 国产一区二区三区在线播放免费观看 | 中文精品一区二区三区| 欧美激情网友自拍| 久久九九久精品国产免费直播 | 亚洲天天影视| 亚洲精品欧美| 久久最新视频| 欧美伊人久久久久久久久影院| 99热免费精品在线观看| ●精品国产综合乱码久久久久| 国产老女人精品毛片久久| 欧美女激情福利| 欧美粗暴jizz性欧美20| 久久精品日韩| 久久精品青青大伊人av| 午夜一级久久| 亚洲欧美激情一区| 正在播放欧美视频| 99亚洲视频| 欧美一区二区福利在线| 一区二区三区日韩在线观看| 亚洲精品一区二区三区樱花 | 久久国产综合精品| 亚洲男人av电影| 亚洲午夜精品国产| 亚洲天堂视频在线观看| 99热精品在线| 亚洲一区二区免费看| 亚洲婷婷综合久久一本伊一区| 9色精品在线| 亚洲午夜免费福利视频| 一区二区日韩| 亚洲永久视频| 午夜精品久久久久影视| 欧美亚洲免费电影| 欧美专区亚洲专区| 久久免费视频网站| 免费看亚洲片| 91久久黄色| 在线一区二区视频| 香蕉久久夜色精品国产使用方法| 午夜亚洲精品| 久久午夜视频| 欧美日韩精品不卡| 国产乱理伦片在线观看夜一区| 狠狠色丁香婷婷综合| 亚洲激情另类| 亚洲免费在线观看视频| 久久精品免视看| 亚洲高清网站|