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

隨筆-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>
            亚洲精品免费一二三区| 欧美插天视频在线播放| 免费国产一区二区| 久久久久久久久久久成人| 久久精品免费观看| 久久久久www| 能在线观看的日韩av| 亚洲第一精品夜夜躁人人爽| 欧美福利专区| 亚洲伦理在线观看| 亚洲一区免费网站| 久久精品日韩欧美| 欧美理论在线| 国产精品综合色区在线观看| 黄网站免费久久| 亚洲精选视频在线| 午夜视频一区在线观看| 免费日本视频一区| 夜夜爽夜夜爽精品视频| 136国产福利精品导航网址| 国产精品毛片| 亚洲福利国产| 亚洲一级黄色| 蜜桃av一区二区在线观看| 亚洲精品综合久久中文字幕| 亚洲欧美精品在线| 美女久久一区| 国产日韩欧美中文| 在线视频精品| 免费av成人在线| 亚洲一区二区影院| 欧美激情第3页| 黄色成人在线| 性8sex亚洲区入口| 亚洲精品国产精品国自产在线| 亚洲在线视频一区| 欧美裸体一区二区三区| 精东粉嫩av免费一区二区三区| 亚洲婷婷免费| 欧美激情中文字幕乱码免费| 羞羞色国产精品| 国产精品h在线观看| 亚洲欧洲日韩女同| 麻豆久久婷婷| 亚洲综合电影一区二区三区| 欧美日本在线一区| 亚洲精品视频中文字幕| 蘑菇福利视频一区播放| 欧美制服丝袜第一页| 国产精品揄拍一区二区| 一区二区三区 在线观看视| 久久亚洲一区| 欧美一区二区在线免费观看| 国产精品成人播放| 亚洲一卡二卡三卡四卡五卡| 亚洲精品在线电影| 欧美日韩不卡合集视频| 亚洲美女中文字幕| 亚洲成色999久久网站| 麻豆乱码国产一区二区三区| 在线播放国产一区中文字幕剧情欧美| 欧美亚洲在线观看| 亚洲在线观看视频网站| 国产欧美日本一区视频| 欧美一区二区三区四区在线观看| 亚洲视频网在线直播| 国产精品久久久久久久久久ktv | 一区二区欧美日韩视频| 欧美日韩另类丝袜其他| 亚洲自拍16p| 亚洲一区二区三区免费观看| 欧美性色aⅴ视频一区日韩精品| 亚洲午夜一区二区三区| 制服丝袜激情欧洲亚洲| 国产欧美日韩专区发布| 快播亚洲色图| 亚洲桃花岛网站| 99av国产精品欲麻豆| 国产精品国产三级国产普通话三级| 亚洲影音一区| 欧美一级欧美一级在线播放| 黄色成人片子| 亚洲日本欧美日韩高观看| 欧美三级欧美一级| 久久精品夜夜夜夜久久| 欧美h视频在线| 亚洲欧美成人综合| 久久久综合网| 亚洲在线观看免费视频| 久久国产免费| 99pao成人国产永久免费视频| 一本久久a久久精品亚洲| 国产一区二区三区黄视频| 亚洲国产精品va| 国产精品亚洲综合色区韩国| 免播放器亚洲| 国产精品www色诱视频| 久久久综合激的五月天| 欧美国产第二页| 久久久久久久久久码影片| 欧美日韩久久不卡| 免费欧美在线视频| 国产嫩草影院久久久久| 亚洲国产裸拍裸体视频在线观看乱了中文| 欧美日韩国产成人在线观看| 欧美一区二区视频网站| 欧美精品一区二区三区久久久竹菊| 欧美在线一二三四区| 欧美精品久久久久久久久老牛影院 | 国产欧美成人| 亚洲人线精品午夜| 一区三区视频| 久久大香伊蕉在人线观看热2| 99精品热视频| 男人的天堂亚洲| 久久久五月婷婷| 国产精品一区久久久| 亚洲人成在线观看网站高清| 在线激情影院一区| 久久福利精品| 久久精品免费播放| 国产情人综合久久777777| 99精品久久久| 一区二区欧美激情| 欧美精品少妇一区二区三区| 欧美成人午夜激情视频| 激情六月综合| 久久国产综合精品| 久久免费国产精品1| 国产欧美日韩视频一区二区| 中文精品视频一区二区在线观看| 日韩一区二区高清| 欧美日韩国产精品一卡| 亚洲精品日韩欧美| 日韩视频一区二区在线观看| 欧美大胆人体视频| 亚洲国产成人不卡| 亚洲日本在线观看| 久久精品91| 欧美一区91| 久久精选视频| 狠狠狠色丁香婷婷综合久久五月| 香蕉av777xxx色综合一区| 欧美在线欧美在线| 国产午夜精品在线观看| 久久精品国产v日韩v亚洲 | 91久久综合| 亚洲六月丁香色婷婷综合久久| 欧美国产第一页| 亚洲三级毛片| 在线视频欧美日韩| 国产精品视频yy9299一区| 欧美一级久久久| 欧美高清在线播放| 在线一区视频| 国产日韩欧美一区二区| 久久久噜噜噜久噜久久| 亚洲福利在线视频| 亚洲影音一区| 影音欧美亚洲| 欧美日韩一区免费| 性欧美长视频| 亚洲精品一区在线观看| 亚洲你懂的在线视频| 国产日韩视频一区二区三区| 久久午夜av| 一区二区免费在线播放| 久久久久久久91| 日韩亚洲欧美综合| 国产亚洲成精品久久| 久久综合色播五月| 一区二区三区不卡视频在线观看 | 中文在线资源观看网站视频免费不卡| 亚洲综合色视频| 黄色一区二区三区四区| 欧美激情国产日韩精品一区18| 中日韩美女免费视频网址在线观看| 久久国产欧美精品| 一片黄亚洲嫩模| 精品1区2区3区4区| 国产精品国产自产拍高清av| 久久久久久电影| 一区二区三区高清| 亚洲国产精品福利| 久久久久国产精品人| 日韩手机在线导航| 亚洲第一中文字幕| 国产日韩欧美三级| 欧美日韩一区二区三区免费| 麻豆久久婷婷| 久久精品国产99国产精品| 亚洲午夜久久久久久久久电影网| 欧美成人免费在线| 久久久久国产精品www| 亚洲一区欧美| 亚洲精品你懂的| 亚洲国产裸拍裸体视频在线观看乱了 | 性色一区二区| 在线午夜精品自拍| 亚洲麻豆视频|