锘??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美午夜久久,欧美福利精品,亚洲性视频网站http://m.shnenglu.com/yishanhante/category/3729.htmlzh-cnThu, 22 May 2008 18:40:12 GMTThu, 22 May 2008 18:40:12 GMT60Overlapped妯″瀷涓嶤ompletionPort妯″瀷http://m.shnenglu.com/yishanhante/articles/23125.htmljayjaySat, 28 Apr 2007 09:14:00 GMThttp://m.shnenglu.com/yishanhante/articles/23125.htmlhttp://m.shnenglu.com/yishanhante/comments/23125.htmlhttp://m.shnenglu.com/yishanhante/articles/23125.html#Feedback0http://m.shnenglu.com/yishanhante/comments/commentRss/23125.htmlhttp://m.shnenglu.com/yishanhante/services/trackbacks/23125.html鎽樿嚜銆奦isual C++緗戠粶娓告垙寤烘ā涓庡疄鐜般嬶紙鑻忕窘銆佺帇濯涘獩緙栬憲錛?/strong> 
Win32閲嶅彔I/O(Overloapped I/O)鏈哄埗鍏佽鍙戣搗涓涓搷浣滐紝鐒跺悗鍦ㄦ搷浣滃畬鎴愪箣鍚庢帴鍙?br>鍒頒俊鎭傚浜庨偅縐嶉渶瑕佸緢闀挎椂闂存墠鑳藉畬鎴愮殑鎿嶄綔鏉ヨ錛岄噸鍙營/O鏈哄埗灝ゅ叾鏈夌敤錛屽洜涓哄彂璧?br>閲嶅彔鎿嶄綔鐨勭嚎紼嬪湪閲嶅彔璇鋒眰鍙戝嚭鍚庡氨鍙互鑷敱鍦板仛鍒殑浜嬫儏浜嗐?br>    鍦╓indows NT/2000涓婏紝鎻愪緵鐪熸鍙墿灞曠殑I/O妯″瀷灝辨槸浣跨敤瀹屾垚绔彛錛圕ompletion
Port)鐨勯噸鍙營/O銆?br>    ……
    鍙互鎶婂畬鎴愮鍙g湅鎴愮郴緇熺淮鎶ょ殑涓涓槦鍒楋紝鎿嶄綔緋葷粺鎶婇噸鍙營/O鎿嶄綔瀹屾垚鐨勪簨浠墮氱煡
鏀懼埌璇ラ槦鍒楅噷錛岀敱浜庢槸鏆撮湶“鎿嶄綔瀹屾垚”鐨勪簨浠墮氱煡錛屾墍浠ュ懡鍚嶄負“瀹屾垚绔彛”錛圕ompletion
Ports)銆備竴涓猄ocket琚垱寤哄悗錛屽彲浠ュ湪浠諱綍鏃跺埢鍜屼竴涓畬鎴愮鍙h仈緋昏搗鏉ャ?br>    涓鑸潵璇達紝涓涓簲鐢ㄧ▼搴忓彲浠ュ垱寤哄涓伐浣滅嚎紼嬫潵澶勭悊瀹屾垚绔彛涓婄殑閫氱煡浜嬩歡銆傚伐浣?br>綰跨▼鐨勬暟閲忎緷璧栦簬紼嬪簭鐨勫叿浣撻渶瑕併備絾鏄湪鐞嗘兂鐨勬儏鍐典笅錛屽簲璇ュ搴斾竴涓狢PU鍒涘緩涓涓嚎
紼嬨傚洜涓哄湪瀹屾垚绔彛鐞嗘兂妯″瀷涓紝姣忎釜綰跨▼閮藉彲浠ヤ粠緋葷粺鑾峰緱涓涓?#8220;鍘熷瓙”鎬х殑鏃墮棿鐗囷紝杞?br>鐣繍琛屽茍媯鏌ュ畬鎴愮鍙o紝綰跨▼鐨勫垏鎹㈡槸棰濆鐨勫紑閿銆傚湪瀹為檯寮鍙戠殑鏃跺欙紝榪樿鑰冭檻榪欎簺綰?br>紼嬫槸鍚︾壍娑夊埌鍏朵粬鍫靛鎿嶄綔鐨勬儏鍐點傚鏋滄煇綰跨▼榪涜鍫靛鎿嶄綔錛岀郴緇熷垯灝嗗叾鎸傝搗錛岃鍒殑
綰跨▼鑾峰緱榪愯鏃墮棿銆傚洜姝わ紝濡傛灉鏈夎繖鏍風殑鎯呭喌錛屽彲浠ュ鍒涘緩鍑犱釜綰跨▼鏉ュ敖閲忓埄鐢ㄦ椂闂淬?br>    搴旂敤瀹屾垚绔彛鍒嗕袱姝ヨ蛋錛?br>    1. 鍒涘緩瀹屾垚绔彛鍙ユ焺錛?br>    HANDLE hIocp;
    hIocp=CreateIoCompletionPort(
    INVALID_HANDLE_VALUE,
    NULL,
    (ULONG_PTR)0,
    0);
    if(hIocp==NULL) {
    //濡傛灉閿欒
      ……
    }
    娉ㄦ剰鍦ㄧ1涓弬鏁?FileHandle)浼犲叆INVALID_FILE_HANDLE錛岀2涓弬鏁?ExistingCompletionPort)
浼犲叆NULL錛岀郴緇熷皢鍒涘緩涓涓柊鐨勫畬鎴愮鍙e彞鏌勶紝娌℃湁浠諱綍I/O鍙ユ焺涓庡叾鍏寵仈銆?

    2. 瀹屾垚绔彛鍒涘緩鎴愬姛鍚庯紝鍦⊿ocket鍜屽畬鎴愮鍙d箣闂村緩绔嬪叧鑱斻傚啀嬈¤皟鐢–reateIoCompletionPort
鍑芥暟錛岃繖涓嬈″湪絎?涓弬鏁癋ileHandle浼犲叆鍒涘緩鐨凷ocket鍙ユ焺錛屽弬鏁癊xistingCompletionPort
涓哄凡緇忓垱寤虹殑瀹屾垚绔彛鍙ユ焺銆?br>    浠ヤ笅浠g爜鍒涘緩浜嗕竴涓猄ocket騫舵妸瀹冨拰瀹屾垚绔彛鑱旂郴璧鋒潵銆?br>    SOCKET s;
    s=Socket(AF_INET,SOCK_STREAM,0);
    if(s==INVALID_SOCKET) {
    if(CreateIoCompletionPort((HANDLE)s,
    hIocp,
    (ULONG_PTR)0,
    0)==NULL)
    {
    //濡傛灉鍒涘緩澶辮觸
      ……
    }
    }
    鍒版涓烘錛孲ocket宸茬粡鎴愬姛鍜屽畬鎴愮鍙g浉鍏寵仈銆傚湪姝ocket榪涜鐨勯噸鍙營/O鎿嶄綔緇撴灉鍧?br>浣跨敤瀹屾垚绔彛鍙戝嚭閫氱煡銆?/p>

    娉ㄦ剰錛欳reateIoCompletionPort鍑芥暟鐨勭3涓弬鏁板厑璁稿紑鍙戜漢鍛樹紶鍏ヤ竴涓被鍨嬩負ULONG_PTR
鐨勬暟鎹垚鍛橈紝鎴戜滑鎶婂畠縐頒負瀹屾垚閿?Completion Key)錛屾鏁版嵁鎴愬憳鍙互璁捐涓烘寚鍚戝寘鍚玈ocket
淇℃伅鐨勪竴涓粨鏋勪綋鐨勪竴涓寚閽堬紝鐢ㄦ潵鎶婄浉鍏崇殑鐜淇℃伅鍜孲ocket鑱旂郴璧鋒潵錛屾瘡嬈″畬鎴愰氱煡鏉?br>鍒扮殑鍚屾椂錛岃鐜淇℃伅涔熼殢鐫閫氱煡涓璧瘋繑鍥炵粰寮鍙戜漢鍛樸?/p>

    瀹屾垚绔彛鍒涘緩浠ュ強涓嶴ocket鍏寵仈涔嬪悗錛屽氨瑕佸垱寤轟竴涓垨澶氫釜宸ヤ綔綰跨▼鏉ュ鐞嗗畬鎴愰氱煡錛?br>姣忎釜綰跨▼閮藉彲浠ュ驚鐜湴璋冪敤GetQueuedCompletionStatus鍑芥暟錛屾鏌ュ畬鎴愮鍙d笂鐨勯氱煡浜嬩歡銆?br>    鍦ㄤ婦渚嬭鏄庝竴涓吀鍨嬬殑宸ヤ綔綰跨▼涔嬪墠錛屾垜浠厛璁ㄨ涓涓嬮噸鍙營/O鐨勮繃紼嬨傚埌涓涓噸鍙營/O
琚彂璧鳳紝涓涓狾verlapped緇撴瀯浣撶殑鎸囬拡灝辮浣滀負鍙傛暟浼犻掔粰緋葷粺銆傚綋鎿嶄綔瀹屾垚鏃訛紝
GetQueueCompletionStatus灝卞彲浠ヨ繑鍥炴寚鍚戝悓涓涓狾verlapped緇撴瀯鐨勬寚閽堛備負浜嗚鯨璁ゅ拰瀹氫綅
榪欎釜宸插畬鎴愮殑鎿嶄綔錛屽紑鍙戜漢鍛樻渶濂藉畾涔夎嚜宸辯殑OVERLAPPED緇撴瀯錛屼互鍖呭惈涓浜涜嚜宸卞畾涔夌殑鍏充簬
鎿嶄綔鏈韓鐨勯澶栦俊鎭傛瘮濡傦細
    typedef struct _OVERLAPPELUS {
      OVERLAPPED ol;
      SOCKET s, sclient;
      int OpCode;
      WSABUF wbuf;
      DWORD dwBytes, dwFlags;
    } OVERLAPPELUS;
    姝ょ粨鏋勭殑絎?涓垚鍛樹負榛樿鐨凮VERLAPPED緇撴瀯錛岀2鍜岀3涓負鏈湴鏈嶅姟Socket鍜屼笌璇?br>鎿嶄綔鐩稿叧鐨勫鎴穝ocket錛岀4涓垚鍛樹負鎿嶄綔綾誨瀷錛屽浜嶴ocket錛岀幇鍦ㄥ畾涔夌殑鏈変互涓?縐嶏細
    #define OP_READ 0
    #define OP_WRITE 1
    #define OP_ACCEPT 2
    鐒跺悗榪樻湁搴旂敤紼嬪簭鐨凷ocket緙撳啿鍖猴紝鎿嶄綔鏁版嵁閲忥紝鏍囧織浣嶄互鍙婂叾浠栧紑鍙戜漢鍛樿涓烘湁鐢?br>鐨勪俊鎭?br>    褰撹繘琛岄噸鍙營/O鎿嶄綔錛屾妸OVERLAPPELUS緇撴瀯浣滀負閲嶅彔I/O鐨勫弬鏁發pOverlapp浼犻掞紙濡?br>WSASend錛學ASRecv錛岀瓑鍑芥暟鐨刲pOverlapped鍙傛暟錛岃姹備紶鍏ヤ竴涓狾VERLAPP緇撴瀯鐨勬寚閽堬級銆?br>    褰撴搷浣滃畬鎴愬悗錛孏etQueuedCompletionStatus鍑芥暟榪斿洖涓涓狶POVERLAPPED綾誨瀷鐨勬寚閽堬紝
榪欎釜鎸囬拡鍏跺疄鏄寚鍚戝紑鍙戜漢鍛樺畾涔夌殑鎵╁睍OVERLAPPELUS緇撴瀯錛屽寘鍚潃寮鍙戜漢鍛樻棭鍏堜紶鍏ョ殑
鍏ㄩ儴淇℃伅銆?/p>

    娉ㄦ剰錛歄VERLAPPED鎴愬憳涓嶄竴瀹氳姹傛槸OVERLAPPELUS鎵╁睍緇撴瀯鐨勪竴涓垚鍛橈紝鍦ㄨ幏寰?br>OVERLAPPED鎸囬拡涔嬪悗錛屽彲浠ョ敤CONTAINING_RECORD瀹忚幏寰楃浉搴旂殑鎵╁睍緇撴瀯鐨勬寚閽堛?/p>

    鍏稿瀷鐨刉orker Thread緇撴瀯錛?br>    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緇撴潫*/
   
    娉ㄦ剰錛氬鏋淥verlapped鎿嶄綔绔嬪埢澶辮觸錛堟瘮濡傦紝榪斿洖SOCKET_ERROR鎴栧叾浠栭潪
    WSA_IO_PENDING鐨勯敊璇級錛屽垯娌℃湁浠諱綍瀹屾垚閫氱煡浜嬩歡浼氳鏀懼埌瀹屾垚绔彛闃熷垪閲屻傚弽涔嬶紝
    鍒欎竴瀹氭湁鐩稿簲鐨勯氱煡浜嬩歡琚斁鍒扮鍙i槦鍒椼?/p>

jay 2007-04-28 17:14 鍙戣〃璇勮
]]>
鐐瑰鐐瑰綰跨▼鏂偣緇紶鐨勫疄鐜癧杞琞http://m.shnenglu.com/yishanhante/articles/22374.htmljayjayFri, 20 Apr 2007 07:18:00 GMThttp://m.shnenglu.com/yishanhante/articles/22374.htmlhttp://m.shnenglu.com/yishanhante/comments/22374.htmlhttp://m.shnenglu.com/yishanhante/articles/22374.html#Feedback0http://m.shnenglu.com/yishanhante/comments/commentRss/22374.htmlhttp://m.shnenglu.com/yishanhante/services/trackbacks/22374.html鍦ㄥ浠婄殑緗戠粶搴旂敤涓紝鏂囦歡鐨勪紶閫佹槸閲嶈鐨勫姛鑳戒箣涓錛屼篃鏄叡浜殑鍩虹銆備竴浜涢噸瑕佺殑鍗忚鍍廐TTP錛孎TP絳夐兘鏀寔鏂囦歡鐨勪紶閫併傚挨鍏舵槸FTP錛屽畠鐨勫叏縐板氨鏄?#8220;鏂囦歡浼犻佸崗璁?#8221;錛屽綋鍒濈殑宸ョ▼甯堣璁¤繖涓鍗忚灝辨槸涓轟簡瑙e喅緗戠粶闂寸殑鏂囦歡浼犻侀棶棰橈紝鑰屼笖浠ュ叾紼沖畾錛岄珮閫燂紝綆鍗曡屼竴鐩翠繚鎸佺潃寰堝ぇ鐨勭敓鍛藉姏銆備綔涓轟竴涓▼搴忓憳錛屼嬌鐢ㄨ繖浜涚幇鏈夌殑鍗忚浼犻佹枃浠剁浉褰撶畝鍗曪紝涓嶈繃錛屽畠浠彧閫傜敤浜庢湇鍔″櫒妯″紡涓傝繖鏍鳳紝褰撴垜浠兂鍦ㄧ偣涓庣偣涔嬮棿浼犻佹枃浠跺氨涓嶉傜敤浜嗘垨鐩稿綋楹葷儲錛屾湁涓縐嶅ぇ鍒灝忕敤鐨勬剰鍛熾傜瑪鑰呬竴鐩存兂瀵繪眰涓縐嶇畝鍗曟湁鏁堬紝涓斿叿澶囧綰跨▼鏂偣緇紶鐨勬柟娉曟潵瀹炵幇鐐逛笌鐐逛箣闂寸殑鏂囦歡浼犻侀棶棰橈紝緇忚繃澶ч噺鐨勭炕闃呰祫鏂欎笌嫻嬭瘯錛岀粓浜庡疄鐜頒簡錛岀幇鎶婂畠鍏變韓鍑烘潵錛屼笌澶у鍒嗕韓銆?br>鎴戝啓浜嗕竴涓互姝や負鍩虹鐨勫疄鐢ㄧ▼搴忥紙緗戠粶浼犲湥錛屽寘鍚簮浠g爜錛夛紝鍙敤浜嗗熀浜嶵CP/IP鐨勭數鑴戜笂錛屼緵澶у瀛︿範銆?br>

(鏈枃婧愪唬鐮佽繍琛屾晥鏋滃浘)


瀹炵幇鏂規硶錛圴C錛嬶紜錛屽熀浜嶵CP/IP鍗忚錛夊涓嬶細
浠嶉噯鐢ㄦ湇鍔″櫒涓庡鎴鋒ā寮忥紝闇鍒嗗埆瀵瑰叾璁捐涓庣紪紼嬨?br>鏈嶅姟鍣ㄧ杈冪畝鍗曪紝涓昏灝辨槸鍔犲叆寰呬紶鏂囦歡錛岀洃鍚鎴鳳紝鍜屼紶閫佹枃浠躲傝岄偅浜涙柇鐐圭畫浼犵殑鍔熻兘錛屼互鍙婃枃浠剁殑綆$悊閮芥斁鍦ㄥ鎴風涓娿?br>
涓銆佹湇鍔″櫒绔?/strong>

棣栧厛浠嬬粛鏈嶅姟鍣ㄧ錛?br>鏈寮濮嬫垜浠瀹氫箟涓涓畝鍗曠殑鍗忚錛屼篃灝辨槸瀹氫箟涓涓湇鍔″櫒绔笌瀹㈡埛绔惉寰楁噦鐨勮璦銆傝屼負浜嗘妸闂綆鍖栵紝鎴戝氨璁╂湇鍔″櫒鍙鍚噦涓ゅ彞璇濓紝涓灝辨槸瀹㈡埛璇?#8220;鎴戣璇繪枃浠朵俊鎭?#8221;錛屼簩灝辨槸“鎴戝噯澶囧ソ浜嗭紝鍙互浼犳枃浠朵簡”銆?br>鐢變簬瑕佸疄鐜板綰跨▼錛屽繀欏繪妸鍔熻兘鐙珛鍑烘潵錛屼笖鍖呰鎴愮嚎紼嬶紝棣栧厛寤轟竴涓洃鍚嚎紼嬶紝涓昏璐熻矗鎺ュ叆瀹㈡埛錛屽茍鍚姩鍙︿竴涓鎴風嚎紼嬨傛垜鐢╒C++瀹炵幇濡備笅錛?br>

DWORD WINAPI listenthread(LPVOID lpparam)
{
//鐢變富鍑芥暟浼犳潵鐨勫鎺ュ瓧
銆銆SOCKET  pthis=(SOCKET)lpparam;
//寮濮嬬洃鍚?
int rc=listen(pthis,30);
//濡傛灉閿欏氨鏄劇ず淇℃伅
if(rc<0){
CString aaa;
aaa="listen閿欒\n";
AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aaa.GetBuffer(0),1);
aaa.ReleaseBuffer();
return 0;
}
//榪涘叆寰幆錛屽茍鎺ユ敹鍒版潵鐨勫鎺ュ瓧
while(1){
//鏂板緩涓涓鎺ュ瓧錛岀敤浜庡鎴風
SOCKET s1;
s1=accept(pthis,NULL,NULL);
銆  //緇欎富鍑芥暟鍙戞湁浜鴻仈鍏ユ秷鎭?
CString aa;
aa="涓浜鴻仈鍏ワ紒\n";
AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aa.GetBuffer(0),1);
aa.ReleaseBuffer();
DWORD dwthread;
//寤虹珛鐢ㄦ埛綰跨▼
::CreateThread(NULL,0,clientthread,(LPVOID)s1,0,&dwthread);
}
return 0;
}
鎺ョ潃鎴戜滑鏉ョ湅鐢ㄦ埛綰跨▼錛?br>鍏堢湅鏂囦歡娑堟伅綾誨畾涔?/strong>錛?br>
struct fileinfo
{
int fileno;//鏂囦歡鍙?
int type;//瀹㈡埛绔兂璇翠粈涔堬紙鍓嶉潰閭d袱鍙ヨ瘽錛岀敤1,2琛ㄧず錛?
long len;//鏂囦歡闀垮害
int seek;//鏂囦歡寮濮嬩綅緗紝鐢ㄤ簬澶氱嚎紼?
char name[100];//鏂囦歡鍚?
};
鐢ㄦ埛綰跨▼鍑芥暟:
DWORD WINAPI clientthread(LPVOID lpparam)
{
//鏂囦歡娑堟伅
fileinfo* fiinfo;
//鎺ユ敹緙撳瓨
char* m_buf;
m_buf=new char[100];
//鐩戝惉鍑芥暟浼犳潵鐨勭敤鎴峰鎺ュ瓧
SOCKET  pthis=(SOCKET)lpparam;
//璇諱紶鏉ョ殑淇℃伅
int aa=readn(pthis,m_buf,100);
//濡傛灉鏈夐敊灝辮繑鍥?
if(aa<0){
closesocket (pthis);
return -1;
}
//鎶婁紶鏉ョ殑淇℃伅杞負瀹氫箟鐨勬枃浠朵俊鎭?
fiinfo=(fileinfo*)m_buf;
CString aaa;
//媯楠屽鎴鋒兂璇翠粈涔?
switch(fiinfo->type)
{
//鎴戣璇繪枃浠朵俊鎭?
case 0:
//璇繪枃浠?
aa=sendn(pthis,(char*)zmfile,1080);
//鏈夐敊
if(aa<0){
closesocket (pthis);
return -1;
}
//鍙戞秷鎭粰涓誨嚱鏁?
aaa="鏀跺埌LIST鍛戒護\n";
AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aaa.GetBuffer(0),1);
break;
//鎴戝噯澶囧ソ浜嗭紝鍙互浼犳枃浠朵簡
case 2:
//鍙戞枃浠舵秷鎭粰涓誨嚱鏁?
aaa.Format("%s  鏂囦歡琚姹傦紒%s\n",zmfile[fiinfo->fileno].name,nameph[fiinfo->fileno]);
AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aaa.GetBuffer(0),1);
//璇繪枃浠訛紝騫朵紶閫?
readfile(pthis,fiinfo->seek,fiinfo->len,fiinfo->fileno);
//鍚笉鎳備綘璇翠粈涔?
default:
aaa="鎺ユ敹鍗忚閿欒錛乗n";
AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aaa.GetBuffer(0),1);
break;
}
return 0;
}
璇繪枃浠跺嚱鏁?/strong>
void readfile(SOCKET  so,int seek,int len,int fino)
{
//鏂囦歡鍚?
CString myname;
myname.Format("%s",nameph[fino]);
CFile myFile;
//鎵撳紑鏂囦歡
myFile.Open(myname, CFile::modeRead | CFile::typeBinary|CFile::shareDenyNone);
//浼犲埌鎸囧畾浣嶇疆銆
myFile.Seek(seek,CFile::begin);
char m_buf[SIZE];
int len2;
int len1;
len1=len;
//寮濮嬫帴鏀訛紝鐩村埌鍙戝畬鏁翠釜鏂囦歡
while(len1>0){
len2=len>SIZE?SIZE:len;
myFile.Read(m_buf, len2);
int aa=sendn(so,m_buf,len2);
if(aa<0){
closesocket (so);
break;
}
len1=len1-aa;
len=len-aa;
}
myFile.Close();
}

鏈嶅姟鍣ㄧ鏈瑕佺殑鍔熻兘鍚勬妧鏈氨鏄繖浜涳紝涓嬮潰浠嬬粛瀹㈡埛绔?br>
浜屻佸鎴風

瀹㈡埛绔渶閲嶈錛屼篃鏈澶嶆潅錛屽畠璐熻矗綰跨▼鐨勭鐞嗭紝榪涘害鐨勮褰曠瓑宸ヤ綔銆?br>
澶ф嫻佺▼濡備笅錛?br>鍏堣繛鎺ユ湇鍔″櫒錛屾帴鐫鍙戦佸懡浠?錛堢粰鎴戞枃浠朵俊鎭級錛屽叾涓寘鎷枃浠墮暱搴︼紝鍚嶅瓧絳夛紝鐒跺悗鏍規嵁闀垮害鍐沖畾鍒嗗嚑涓嚎紼嬩笅杞斤紝騫跺垵浣垮寲涓嬭澆榪涚▼錛屾帴鐫鍙戦佸懡浠?錛堝彲浠ョ粰鎴戜紶鏂囦歡浜嗭級錛屽茍璁板綍鏂囦歡榪涚▼銆傛渶鍚庯紝鏀跺熬銆?br>榪欏叾涓湁涓涓崄鍒嗛噸瑕佺殑綾伙紝灝辨槸cdownload綾伙紝瀹氫箟濡備笅錛?

class cdownload
{
public:
void createthread();//寮綰跨▼
DWORD finish1();//瀹屾垚綰跨▼
int sendlist();//鍙戝懡浠?
downinfo doinfo;//鏂囦歡淇℃伅錛堜笌鏈嶅姟鍣ㄥ畾涔変竴鏍鳳級
int startask(int n);寮濮嬩紶鏂囦歡n
long m_index;
BOOL good[BLACK];
int  filerange[100];
CString fname;
CString fnametwo;
UINT threadfunc(long index);//涓嬭澆榪涚▼
int sendrequest(int n);//鍙戞枃浠朵俊鎭?
cdownload(int thno1);
virtual ~cdownload();
};
涓嬮潰鍏堜粙緇峴endrequest(int n)錛屽湪寮濮嬪墠錛屽悜鏈嶅姟鍣ㄥ彂鑾峰緱鏂囦歡娑堟伅鍛戒護錛屼互渚胯瀹㈡埛绔煡閬撴湁鍝簺鏂囦歡鍙紶
int cdownload::sendrequest(int n)
{
//寤哄鎺ュ瓧
sockaddr_in local;
SOCKET m_socket;
int rc=0;
//鍒濅嬌鍖栨湇鍔″櫒鍦板潃
local.sin_family=AF_INET;
local.sin_port=htons(1028);
local.sin_addr.S_un.S_addr=inet_addr(ip);
m_socket=socket(AF_INET,SOCK_STREAM,0);
int ret;
//鑱旀帴鏈嶅姟鍣?
ret=connect(m_socket,(LPSOCKADDR)&local,sizeof(local));
//鏈夐敊鐨勮瘽
if(ret<0){
AfxMessageBox("鑱旀帴閿欒");
closesocket(m_socket);
return -1;
}
//鍒濅嬌鍖栧懡浠?
fileinfo fileinfo1;
fileinfo1.len=n;
fileinfo1.seek=50;
fileinfo1.type=1;
//鍙戦佸懡浠?
int aa=sendn(m_socket,(char*)&fileinfo1,100);
if(aa<0){
closesocket(m_socket);
return -1;
}
//鎺ユ敹鏈嶅姟鍣ㄤ紶鏉ョ殑淇℃伅
aa=readn(m_socket,(char*)&fileinfo1,100);
if(aa<0){
closesocket(m_socket);
return -1;
}
//鍏抽棴
shutdown(m_socket,2);
closesocket(m_socket);
return 1;
}
鏈変簡鏂囦歡娑堟伅鍚庢垜浠氨鍙互涓嬭澆鏂囦歡浜嗐傚湪涓誨嚱鏁頒腑錛岀敤娉曞涓嬶細
//涓嬭澆絎琧lno涓枃浠訛紝騫朵負瀹冨緩涓涓柊cdownload綾?
down[clno]=new cdownload(clno);
//寮濮嬩笅杞斤紝騫跺垵浣垮寲
type=down[clno]->startask(clno);
//寤虹珛鍚勭嚎紼?
createthread(clno);
涓嬮潰浠嬬粛寮濮嬫柟娉?/strong>:
//寮濮嬫柟娉?
int cdownload::startask(int n)
{
//璇誨叆鏂囦歡闀垮害
doinfo.filelen=zmfile[n].length;
//璇誨叆鍚嶅瓧
fname=zmfile[n].name;
CString tmep;
//鍒濅嬌鍖栨枃浠跺悕
tmep.Format("\\temp\\%s",fname);
//緇欎富鍑芥暟鍙戞秷鎭?
CString aaa;
aaa="姝e湪璇誨彇 "+fname+" 淇℃伅錛岄┈涓婂紑濮嬩笅杞姐傘傘俓n";
AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aaa.GetBuffer(0),1);
aaa.ReleaseBuffer();
//濡傛灉鏂囦歡闀垮害灝忎簬0灝辮繑鍥?
if(doinfo.filelen<=0) return -1;
//寤轟竴涓互.down緇撳熬鐨勬枃浠惰褰曟枃浠朵俊鎭?
CString m_temp;
m_temp=fname+".down";
doinfo.name=m_temp;
FILE* fp=NULL;
CFile myfile;
//濡傛灉鏄涓嬈′笅杞芥枃浠訛紝鍒濅嬌鍖栧悇璁板綍鏂囦歡
if((fp=fopen(m_temp,"r"))==NULL){
filerange[0]=0;
//鏂囦歡鍒嗗潡
for(int i=0;i<BLACK;i++)
{
if(i>0)
filerange[i*2]=i*(doinfo.filelen/BLACK+1);
filerange[i*2+1]=doinfo.filelen/BLACK+1;
}
filerange[BLACK*2-1]=doinfo.filelen-filerange[BLACK*2-2];
myfile.Open(m_temp,CFile::modeCreate|CFile::modeWrite | CFile::typeBinary);
//鍐欏叆鏂囦歡闀垮害
myfile.Write(&doinfo.filelen,sizeof(int));
myfile.Close();
銆
CString temp;
for(int ii=0;ii<BLACK;ii++){
//鍒濅嬌鍖栧悇榪涚▼璁板綍鏂囦歡淇℃伅錛堜互.downN緇撳熬錛?
temp.Format(".down%d",ii);
m_temp=fname+temp;
myfile.Open(m_temp,CFile::modeCreate|CFile::modeWrite | CFile::typeBinary);
//鍐欏叆鍚勮繘紼嬫枃浠朵俊鎭?
myfile.Write(&filerange[ii*2],sizeof(int));
myfile.Write(&filerange[ii*2+1],sizeof(int));
myfile.Close();
}
((CMainFrame*)::AfxGetMainWnd())->m_work.m_ListCtrl->AddItemtwo(n,2,0,0,0,doinfo.threadno);
}
else{
//濡傛灉鏂囦歡宸插瓨鍦紝璇存槑鏄畫浼狅紝璇諱笂嬈′俊鎭?
CString temp;
銆
m_temp=fname+".down0";
if((fp=fopen(m_temp,"r"))==NULL)
return 1;
else fclose(fp);
int bb;
bb=0;
//璇誨悇榪涚▼璁板綍鐨勪俊鎭?
for(int ii=0;ii<BLACK;ii++)
{
temp.Format(".down%d",ii);
m_temp=fname+temp;
銆
myfile.Open(m_temp,CFile::modeRead | CFile::typeBinary);
myfile.Read(&filerange[ii*2],sizeof(int));
myfile.Read(&filerange[ii*2+1],sizeof(int));
myfile.Close();
bb = bb+filerange[ii*2+1];
CString temp;
}
if(bb==0) return 1;
doinfo.totle=doinfo.filelen-bb;
銆
((CMainFrame*)::AfxGetMainWnd())->m_work.m_ListCtrl->AddItemtwo(n,2,doinfo.totle,1,0,doinfo.threadno);
}
銆	//寤虹珛涓嬭澆緇撴潫榪涚▼timethread錛屼互綆$幇鍚勮繘紼嬬粨鏉熸椂闂淬?
DWORD dwthread;
::CreateThread(NULL,0,timethread,(LPVOID)this,0,&dwthread);
return 0;
}
涓嬮潰浠嬬粛寤虹珛鍚勮繘紼?/strong>鍑芥暟錛屽緢綆鍗曪細
void CMainFrame::createthread(int threadno)
{
DWORD dwthread;
//寤虹珛BLACK涓繘紼?
for(int i=0;i<BLACK;i++)
{
m_thread[threadno][i]=	::CreateThread(NULL,0,downthread,(LPVOID)down[threadno],0,&dwthread);
}
}
downthread榪涚▼鍑芥暟
DWORD WINAPI downthread(LPVOID lpparam)
{
cdownload* pthis=(cdownload*)lpparam;
//榪涚▼寮曠儲錛?
InterlockedIncrement(&pthis->m_index);
//鎵ц涓嬭澆榪涚▼
pthis->threadfunc(pthis->m_index-1);
return 1;
}
涓嬮潰浠嬬粛涓嬭澆榪涚▼鍑芥暟,鏈鏈鏍稿績鐨勪笢瑗夸簡
UINT cdownload::threadfunc(long index)
{
//鍒濅嬌鍖栬仈鎺?
sockaddr_in local;
SOCKET m_socket;
int rc=0;
銆
local.sin_family=AF_INET;
local.sin_port=htons(1028);
local.sin_addr.S_un.S_addr=inet_addr(ip);
m_socket=socket(AF_INET,SOCK_STREAM,0);
int ret;
//璇誨叆緙撳瓨
char* m_buf=new char[SIZE];
int re,len2;
fileinfo fileinfo1;
//鑱旀帴
ret=connect(m_socket,(LPSOCKADDR)&local,sizeof(local));
//璇誨叆鍚勮繘紼嬬殑涓嬭澆淇℃伅
fileinfo1.len=filerange[index*2+1];
fileinfo1.seek=filerange[index*2];
fileinfo1.type=2;
fileinfo1.fileno=doinfo.threadno;
銆
re=fileinfo1.len;
銆
//鎵撳紑鏂囦歡銆
CFile destFile;
FILE* fp=NULL;
//鏄涓嬈′紶鐨勮瘽
if((fp=fopen(fname,"r"))==NULL)
destFile.Open(fname, CFile::modeCreate|CFile::modeWrite | CFile::typeBinary|CFile::shareDenyNone);
else
//濡傛灉鏂囦歡瀛樺湪錛屾槸緇紶
destFile.Open(fname,CFile::modeWrite | CFile::typeBinary|CFile::shareDenyNone);
//鏂囦歡鎸囬拡縐誨埌鎸囧畾浣嶇疆
destFile.Seek(filerange[index*2],CFile::begin);
//鍙戞秷鎭粰鏈嶅姟鍣紝鍙互浼犳枃浠朵簡
sendn(m_socket,(char*)&fileinfo1,100);
CFile myfile;
CString temp;
temp.Format(".down%d",index);
m_temp=fname+temp;
銆	//褰撳悇孌甸暱搴﹁繕涓嶄負0鏃?
while(re>0){
len2=re>SIZE?SIZE:re;
銆
//璇誨悇孌靛唴瀹?
int len1=readn(m_socket,m_buf,len2);
//鏈夐敊鐨勮瘽
if(len1<0){
closesocket(m_socket);
break;
}
銆
//鍐欏叆鏂囦歡
destFile.Write(m_buf, len1);
//鏇存敼璁板綍榪涘害淇℃伅
filerange[index*2+1]-=len1;
filerange[index*2]+=len1;
//縐誨姩璁板綍鏂囦歡鎸囬拡鍒板ご
myfile.Seek(0,CFile::begin);
//鍐欏叆璁板綍榪涘害
myfile.Write(&filerange[index*2],sizeof(int));
myfile.Write(&filerange[index*2+1],sizeof(int));
//鍑忓幓榪欐璇葷殑闀垮害
re=re-len1;
//鍔犳枃浠墮暱搴?
doinfo.totle=doinfo.totle+len1;
};
//榪欏潡涓嬭澆瀹屾垚錛屾敹灝?
銆
myfile.Close();
destFile.Close();
delete [] m_buf;
shutdown(m_socket,2);
銆
銆
if(re<=0) good[index]=TRUE;
return 1;
}

鍒拌繖瀹㈡埛绔殑涓昏妯″潡鍜屾満鍒跺凡鍩烘湰浠嬬粛瀹屻傚笇鏈涘ソ濂戒綋浼氫竴涓嬭繖縐嶅綰跨▼鏂偣緇紶鐨勬柟娉曘?



jay 2007-04-20 15:18 鍙戣〃璇勮
]]>
鐢ㄥ畬鎴愮鍙e紑鍙戝ぇ鍝嶅簲瑙勬ā鐨刉insock搴旂敤紼嬪簭[杞琞http://m.shnenglu.com/yishanhante/articles/22302.htmljayjayThu, 19 Apr 2007 06:05:00 GMThttp://m.shnenglu.com/yishanhante/articles/22302.htmlhttp://m.shnenglu.com/yishanhante/comments/22302.htmlhttp://m.shnenglu.com/yishanhante/articles/22302.html#Feedback0http://m.shnenglu.com/yishanhante/comments/commentRss/22302.htmlhttp://m.shnenglu.com/yishanhante/services/trackbacks/22302.html鍘熸枃鍑哄錛?a target=_blank>http://msdn.microsoft.com/msdnmag/issues/1000/Winsock/

閫氬父瑕佸紑鍙戠綉緇滃簲鐢ㄧ▼搴忓茍涓嶆槸涓浠惰交鏉劇殑浜嬫儏錛屼笉榪囷紝瀹為檯涓婂彧瑕佹帉鎻″嚑涓叧閿殑鍘熷垯涔熷氨鍙互浜嗏斺斿垱寤哄拰榪炴帴涓涓鎺ュ瓧錛屽皾璇曡繘琛岃繛鎺ワ紝鐒跺悗鏀跺彂鏁版嵁銆傜湡姝i毦鐨勬槸瑕佸啓鍑轟竴涓彲浠ユ帴綰沖皯鍒欎竴涓紝澶氬垯鏁板崈涓繛鎺ョ殑緗戠粶搴旂敤紼嬪簭銆傛湰鏂囧皢璁ㄨ濡備綍閫氳繃Winsock2鍦╓indows NT 鍜?Windows 2000涓婂紑鍙戦珮鎵╁睍鑳藉姏鐨刉insock搴旂敤紼嬪簭銆傛枃绔犱富瑕佺殑鐒︾偣鍦ㄥ鎴鋒満/鏈嶅姟鍣ㄦā鍨嬬殑鏈嶅姟鍣ㄨ繖涓鏂癸紝褰撶劧錛屽叾涓殑璁稿瑕佺偣瀵規ā鍨嬬殑鍙屾柟閮介傜敤銆?

API涓庡搷搴旇妯?/strong>

閫氳繃Win32鐨勯噸鍙營/O鏈哄埗錛屽簲鐢ㄧ▼搴忓彲浠ユ彁璇蜂竴欏笽/O鎿嶄綔錛岄噸鍙犵殑鎿嶄綔璇鋒眰鍦ㄥ悗鍙板畬鎴愶紝鑰屽悓涓鏃墮棿鎻愯鎿嶄綔鐨勭嚎紼嬪幓鍋氬叾浠栫殑浜嬫儏銆傜瓑閲嶅彔鎿嶄綔瀹屾垚鍚庣嚎紼嬫敹鍒版湁鍏崇殑閫氱煡銆傝繖縐嶆満鍒跺閭d簺鑰楁椂鐨勬搷浣滆岃█鐗瑰埆鏈夌敤銆備笉榪囷紝鍍廤indows 3.1涓婄殑WSAAsyncSelect()鍙奤nix涓嬬殑select()閭f牱鐨勫嚱鏁拌櫧鐒舵槗浜庝嬌鐢紝浣嗘槸瀹冧滑涓嶈兘婊¤凍鍝嶅簲瑙勬ā鐨勯渶瑕併傝屽畬鎴愮鍙f満鍒舵槸閽堝鎿嶄綔緋葷粺鍐呴儴榪涜浜嗕紭鍖栵紝鍦╓indows NT 鍜?Windows 2000涓婏紝浣跨敤浜嗗畬鎴愮鍙g殑閲嶅彔I/O鏈哄埗鎵嶈兘澶熺湡姝f墿澶х郴緇熺殑鍝嶅簲瑙勬ā銆?/p>

瀹屾垚绔彛

涓涓畬鎴愮鍙e叾瀹炲氨鏄竴涓氱煡闃熷垪錛岀敱鎿嶄綔緋葷粺鎶婂凡緇忓畬鎴愮殑閲嶅彔I/O璇鋒眰鐨勯氱煡鏀懼叆鍏朵腑銆傚綋鏌愰」I/O鎿嶄綔涓鏃﹀畬鎴愶紝鏌愪釜鍙互瀵硅鎿嶄綔緇撴灉榪涜澶勭悊鐨勫伐浣滆呯嚎紼嬪氨浼氭敹鍒頒竴鍒欓氱煡銆傝屽鎺ュ瓧鍦ㄨ鍒涘緩鍚庯紝鍙互鍦ㄤ換浣曟椂鍊欎笌鏌愪釜瀹屾垚绔彛榪涜鍏寵仈銆?/p>

閫氬父鎯呭喌涓嬶紝鎴戜滑浼氬湪搴旂敤紼嬪簭涓垱寤轟竴瀹氭暟閲忕殑宸ヤ綔鑰呯嚎紼嬫潵澶勭悊榪欎簺閫氱煡銆傜嚎紼嬫暟閲忓彇鍐充簬搴旂敤紼嬪簭鐨勭壒瀹氶渶瑕併傜悊鎯崇殑鎯呭喌鏄紝綰跨▼鏁伴噺絳変簬澶勭悊鍣ㄧ殑鏁伴噺錛屼笉榪囪繖涔熻姹備換浣曠嚎紼嬮兘涓嶅簲璇ユ墽琛岃濡傚悓姝ヨ鍐欍佺瓑寰呬簨浠墮氱煡絳夐樆濉炲瀷鐨勬搷浣滐紝浠ュ厤綰跨▼闃誨銆傛瘡涓嚎紼嬮兘灝嗗垎鍒頒竴瀹氱殑CPU鏃墮棿錛屽湪姝ゆ湡闂磋綰跨▼鍙互榪愯錛岀劧鍚庡彟涓涓嚎紼嬪皢鍒嗗埌涓涓椂闂寸墖騫跺紑濮嬫墽琛屻傚鏋滄煇涓嚎紼嬫墽琛屼簡闃誨鍨嬬殑鎿嶄綔錛屾搷浣滅郴緇熷皢鍓ュず鍏舵湭浣跨敤鐨勫墿浣欐椂闂寸墖騫惰鍏跺畠綰跨▼寮濮嬫墽琛屻備篃灝辨槸璇達紝鍓嶄竴涓嚎紼嬫病鏈夊厖鍒嗕嬌鐢ㄥ叾鏃墮棿鐗囷紝褰撳彂鐢熻繖鏍風殑鎯呭喌鏃訛紝搴旂敤紼嬪簭搴旇鍑嗗鍏跺畠綰跨▼鏉ュ厖鍒嗗埄鐢ㄨ繖浜涙椂闂寸墖銆?/p>

瀹屾垚绔彛鐨勪嬌鐢ㄥ垎涓轟袱姝ャ傞鍏堝垱寤哄畬鎴愮鍙o紝濡備互涓嬩唬鐮佹墍紺猴細

HANDLE    hIocp;
hIocp = CreateIoCompletionPort(
INVALID_HANDLE_VALUE,
NULL,
(ULONG_PTR)0,
0);
if (hIocp == NULL) {
// Error
}
瀹屾垚绔彛鍒涘緩鍚庯紝瑕佹妸灝嗕嬌鐢ㄨ瀹屾垚绔彛鐨勫鎺ュ瓧涓庝箣鍏寵仈璧鋒潵銆傛柟娉曟槸鍐嶆璋冪敤CreateIoCompletionPort ()鍑芥暟錛岀涓涓弬鏁癋ileHandle璁句負濂楁帴瀛楃殑鍙ユ焺錛岀浜屼釜鍙傛暟ExistingCompletionPort 璁句負鍒氬垰鍒涘緩鐨勯偅涓畬鎴愮鍙g殑鍙ユ焺銆?br>浠ヤ笅浠g爜鍒涘緩浜嗕竴涓鎺ュ瓧錛屽茍鎶婂畠鍜屽墠闈㈠垱寤虹殑瀹屾垚绔彛鍏寵仈璧鋒潵錛?
SOCKET    s;
s = socket(AF_INET, SOCK_STREAM, 0);
if (s == INVALID_SOCKET) {
// Error
if (CreateIoCompletionPort((HANDLE)s,
hIocp,
(ULONG_PTR)0,
0) == NULL)
{
// Error
}
...
}

榪欐椂灝卞畬鎴愪簡濂楁帴瀛椾笌瀹屾垚绔彛鐨勫叧鑱旀搷浣溿傚湪榪欎釜濂楁帴瀛椾笂榪涜鐨勪換浣曢噸鍙犳搷浣滈兘灝嗛氳繃瀹屾垚绔彛鍙戝嚭瀹屾垚閫氱煡銆傛敞鎰忥紝CreateIoCompletionPort()鍑芥暟涓殑絎笁涓弬鏁扮敤鏉ヨ緗竴涓笌璇ュ鎺ュ瓧鐩稿叧鐨?#8220;瀹屾垚閿?completion key)”(璇戣呮敞錛氬畬鎴愰敭鍙互鏄換浣曟暟鎹被鍨?銆傛瘡褰撳畬鎴愰氱煡鍒版潵鏃訛紝搴旂敤紼嬪簭鍙互璇誨彇鐩稿簲鐨勫畬鎴愰敭錛屽洜姝わ紝瀹屾垚閿彲鐢ㄦ潵緇欏鎺ュ瓧浼犻掍竴浜涜儗鏅俊鎭?

鍦ㄥ垱寤轟簡瀹屾垚绔彛銆佸皢涓涓垨澶氫釜濂楁帴瀛椾笌涔嬬浉鍏寵仈涔嬪悗錛屾垜浠氨瑕佸垱寤鴻嫢騫蹭釜綰跨▼鏉ュ鐞嗗畬鎴愰氱煡銆傝繖浜涚嚎紼嬩笉鏂驚鐜皟鐢℅etQueuedCompletionStatus ()鍑芥暟騫惰繑鍥炲畬鎴愰氱煡銆?/p>

涓嬮潰錛屾垜浠厛鏉ョ湅鐪嬪簲鐢ㄧ▼搴忓浣曡窡韙繖浜涢噸鍙犳搷浣溿傚綋搴旂敤紼嬪簭璋冪敤涓涓噸鍙犳搷浣滃嚱鏁版椂錛岃鎶婃寚鍚戜竴涓猳verlapped緇撴瀯鐨勬寚閽堝寘鎷湪鍏跺弬鏁頒腑銆傚綋鎿嶄綔瀹屾垚鍚庯紝鎴戜滑鍙互閫氳繃GetQueuedCompletionStatus()鍑芥暟涓嬁鍥炶繖涓寚閽堛備笉榪囷紝鍗曟槸鏍規嵁榪欎釜鎸囬拡鎵鎸囧悜鐨刼verlapped緇撴瀯錛屽簲鐢ㄧ▼搴忓茍涓嶈兘鍒嗚鯨絀剁珶瀹屾垚鐨勬槸鍝釜鎿嶄綔銆傝瀹炵幇瀵規搷浣滅殑璺熻釜錛屼綘鍙互鑷繁瀹氫箟涓涓狾VERLAPPED緇撴瀯錛屽湪鍏朵腑鍔犲叆鎵闇鐨勮窡韙俊鎭?/p>

鏃犺浣曟椂璋冪敤閲嶅彔鎿嶄綔鍑芥暟鏃訛紝鎬繪槸浼氶氳繃鍏秎pOverlapped鍙傛暟浼犻掍竴涓狾VERLAPPEDPLUS緇撴瀯(渚嬪WSASend銆?WSARecv絳夊嚱鏁?銆傝繖灝卞厑璁鎬綘涓烘瘡涓涓噸鍙犺皟鐢ㄦ搷浣滆緗煇浜涙搷浣滅姸鎬佷俊鎭紝褰撴搷浣滅粨鏉熷悗錛屼綘鍙互閫氳繃GetQueuedCompletionStatus()鍑芥暟鑾峰緱浣犺嚜瀹氫箟緇撴瀯鐨勬寚閽堛傛敞鎰廜VERLAPPED瀛楁涓嶈姹備竴瀹氭槸榪欎釜鎵╁睍鍚庣殑緇撴瀯鐨勭涓涓瓧孌點傚綋寰楀埌浜嗘寚鍚慜VERLAPPED緇撴瀯鐨勬寚閽堜互鍚庯紝鍙互鐢–ONTAINING_RECORD瀹忓彇鍑哄叾涓寚鍚戞墿灞曠粨鏋勭殑鎸囬拡銆?/p>

OVERLAPPED 緇撴瀯鐨勫畾涔夊涓嬶細

typedef struct _OVERLAPPEDPLUS {
OVERLAPPED        ol;
SOCKET            s, sclient;
int               OpCode;
WSABUF            wbuf;
DWORD             dwBytes, dwFlags;
// 鍏跺畠鏈夌敤鐨勪俊鎭?
} OVERLAPPEDPLUS;
#define OP_READ     0
#define OP_WRITE    1
#define OP_ACCEPT   2
涓嬮潰璁╂垜浠潵鐪嬬湅宸ヤ綔鑰呯嚎紼嬬殑鎯呭喌銆?br>
宸ヤ綔綰跨▼WorkerThread浠g爜錛?
DWORD WINAPI WorkerThread(LPVOID lpParam)
{
ULONG_PTR       *PerHandleKey;
OVERLAPPED      *Overlap;
OVERLAPPEDPLUS  *OverlapPlus,
*newolp;
DWORD           dwBytesXfered;
while (1)
{
ret = GetQueuedCompletionStatus(
hIocp,
&dwBytesXfered,
(PULONG_PTR)&PerHandleKey,
&Overlap,
INFINITE);
if (ret == 0)
{
// Operation failed
continue;
}
OverlapPlus = CONTAINING_RECORD(Overlap, OVERLAPPEDPLUS, ol);
switch (OverlapPlus->OpCode)
{
case OP_ACCEPT:
// Client socket is contained in OverlapPlus.sclient
// Add client to completion port
CreateIoCompletionPort(
(HANDLE)OverlapPlus->sclient,
hIocp,
(ULONG_PTR)0,
0);
//  Need a new OVERLAPPEDPLUS structure
//  for the newly accepted socket. Perhaps
//  keep a look aside list of free structures.
newolp = AllocateOverlappedPlus();
if (!newolp)
{
// Error
}
newolp->s = OverlapPlus->sclient;
newolp->OpCode = OP_READ;
// This function prepares the data to be sent
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)
{
// Error
}
}
// Put structure in look aside list for later use
FreeOverlappedPlus(OverlapPlus);
// Signal accept thread to issue another AcceptEx
SetEvent(hAcceptThread);
break;
case OP_READ:
// Process the data read
// ...
// Repost the read if necessary, reusing the same
// receive buffer as before
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)
{
// Error
}
}
break;
case OP_WRITE:
// Process the data sent, etc.
break;
} // switch
} // while
}  // WorkerThread
鍏朵腑姣忓彞鏌勯敭(PerHandleKey)鍙橀噺鐨勫唴瀹癸紝鏄湪鎶婂畬鎴愮鍙d笌濂楁帴瀛楄繘琛屽叧鑱旀椂鎵璁劇疆鐨勫畬鎴愰敭鍙傛暟錛汷verlap鍙傛暟榪斿洖鐨勬槸涓涓寚鍚戝彂鍑洪噸鍙犳搷浣滄椂鎵浣跨敤鐨勯偅涓狾VERLAPPEDPLUS緇撴瀯鐨勬寚閽堛?

瑕佽浣忥紝濡傛灉閲嶅彔鎿嶄綔璋冪敤澶辮觸鏃?涔熷氨鏄錛岃繑鍥炲兼槸SOCKET_ERROR錛屽茍涓旈敊璇師鍥犱笉鏄疻SA_IO_PENDING)錛岄偅涔堝畬鎴愮鍙e皢涓嶄細鏀跺埌浠諱綍瀹屾垚閫氱煡銆傚鏋滈噸鍙犳搷浣滆皟鐢ㄦ垚鍔燂紝鎴栬呭彂鐢熷師鍥犳槸WSA_IO_PENDING鐨勯敊璇椂錛屽畬鎴愮鍙e皢鎬繪槸鑳藉鏀跺埌瀹屾垚閫氱煡銆?br>
Windows NT鍜學indows 2000鐨勫鎺ュ瓧鏋舵瀯

瀵逛簬寮鍙戝ぇ鍝嶅簲瑙勬ā鐨刉insock搴旂敤紼嬪簭鑰岃█錛屽Windows NT鍜學indows 2000鐨勫鎺ュ瓧鏋舵瀯鏈夊熀鏈殑浜嗚В鏄緢鏈夊府鍔╃殑銆備笅鍥炬槸Windows 2000涓殑Winsock鏋舵瀯錛?br>

涓庡叾瀹冪被鍨嬫搷浣滅郴緇熶笉鍚岋紝Windows NT鍜學indows 2000鐨勪紶杈撳崗璁病鏈変竴縐嶉鏍煎儚濂楁帴瀛楅偅鏍風殑銆佸彲浠ュ拰搴旂敤紼嬪簭鐩存帴浜よ皥鐨勭晫闈紝鑰屾槸閲囩敤浜嗕竴縐嶆洿涓哄簳灞傜殑API錛屽彨鍋氫紶杈撻┍鍔ㄧ▼搴忕晫闈?Transport Driver Interface,TDI)銆俉insock鐨勬牳蹇冩ā寮忛┍鍔ㄧ▼搴忚礋璐h繛鎺ュ拰緙撳啿鍖虹鐞嗭紝浠ヤ究鍚戝簲鐢ㄧ▼搴忔彁渚涘鎺ュ瓧浠跨湡(鍦ˋFD.SYS鏂囦歡涓疄鐜?錛屽悓鏃惰礋璐d笌搴曞眰浼犺緭椹卞姩紼嬪簭瀵硅瘽銆?/p>

璋佹潵璐熻矗綆$悊緙撳啿鍖猴紵

姝e涓婇潰鎵璇寸殑錛屽簲鐢ㄧ▼搴忛氳繃Winsock鏉ュ拰浼犺緭鍗忚椹卞姩紼嬪簭浜よ皥錛岃孉FD.SYS璐熻矗涓哄簲鐢ㄧ▼搴忚繘琛岀紦鍐插尯綆$悊銆備篃灝辨槸璇達紝褰撳簲鐢ㄧ▼搴忚皟鐢╯end()鎴朩SASend()鍑芥暟鏉ュ彂閫佹暟鎹椂錛孉FD.SYS灝嗘妸鏁版嵁鎷瘋礉榪涘畠鑷繁鐨勫唴閮ㄧ紦鍐插尯(鍙栧喅浜嶴O_SNDBUF璁懼畾鍊?錛岀劧鍚巗end()鎴朩SASend()鍑芥暟绔嬪嵆榪斿洖銆備篃鍙互榪欎箞璇達紝AFD.SYS鍦ㄥ悗鍙拌礋璐f妸鏁版嵁鍙戦佸嚭鍘匯備笉榪囷紝濡傛灉搴旂敤紼嬪簭瑕佹眰鍙戝嚭鐨勬暟鎹秴榪囦簡SO_SNDBUF璁懼畾鐨勭紦鍐插尯澶у皬錛岄偅涔圵SASend()鍑芥暟浼氶樆濉烇紝鐩磋嚦鎵鏈夋暟鎹彂閫佸畬姣曘?/p>

浠庤繙紼嬪鎴風鎺ユ敹鏁版嵁鐨勬儏鍐典篃綾諱技銆傚彧瑕佷笉鐢ㄤ粠搴旂敤紼嬪簭閭i噷鎺ユ敹澶ч噺鐨勬暟鎹紝鑰屼笖娌℃湁瓚呭嚭SO_RCVBUF璁懼畾鐨勫鹼紝AFD.SYS灝嗘妸鏁版嵁鍏堟嫹璐濆埌鍏跺唴閮ㄧ紦鍐插尯涓傚綋搴旂敤紼嬪簭璋冪敤recv()鎴朩SARecv()鍑芥暟鏃訛紝鏁版嵁灝嗕粠鍐呴儴緙撳啿鎷瘋礉鍒板簲鐢ㄧ▼搴忔彁渚涚殑緙撳啿鍖恒?/p>

澶氭暟鎯呭喌涓嬶紝榪欐牱鐨勬灦鏋勮繍琛岃壇濂斤紝鐗瑰埆鍦ㄦ槸搴旂敤紼嬪簭閲囩敤浼犵粺鐨勫鎺ュ瓧涓嬮潪閲嶅彔鐨剆end()鍜宺eceive()妯″紡緙栧啓鐨勬椂鍊欍備笉榪囩▼搴忓憳瑕佸皬蹇冪殑鏄紝灝界鍙互閫氳繃setsockopt()榪欎釜API鏉ユ妸SO_SNDBUF鍜孲O_RCVBUF閫夐」鍊艱鎴?(鍏抽棴鍐呴儴緙撳啿鍖?錛屼絾鏄▼搴忓憳蹇呴』鍗佸垎娓呮鎶夾FD.SYS鐨勫唴閮ㄧ紦鍐插尯鍏蟲帀浼氶犳垚浠涔堝悗鏋滐紝閬垮厤鏀跺彂鏁版嵁鏃舵湁鍏崇殑緙撳啿鍖烘嫹璐濆彲鑳藉紩璧風殑緋葷粺宕╂簝銆?/p>

涓句緥鏉ヨ錛屼竴涓簲鐢ㄧ▼搴忛氳繃璁懼畾SO_SNDBUF涓?鎶婄紦鍐插尯鍏抽棴錛岀劧鍚庡彂鍑轟竴涓樆濉瀞end()璋冪敤銆傚湪榪欐牱鐨勬儏鍐典笅錛岀郴緇熷唴鏍鎬細鎶婂簲鐢ㄧ▼搴忕殑緙撳啿鍖洪攣瀹氾紝鐩村埌鎺ユ敹鏂圭‘璁ゆ敹鍒頒簡鏁翠釜緙撳啿鍖哄悗send()璋冪敤鎵嶈繑鍥炪備技涔庤繖鏄竴縐嶅垽瀹氫綘鐨勬暟鎹槸鍚﹀凡緇忎負瀵規柟鍏ㄩ儴鏀跺埌鐨勭畝媧佺殑鏂規硶錛屽疄闄呬笂鍗村茍闈炲姝ゃ傛兂鎯崇湅錛屽嵆浣胯繙绔疶CP閫氱煡鏁版嵁宸茬粡鏀跺埌錛屽叾瀹炰篃鏍規湰涓嶄唬琛ㄦ暟鎹凡緇忔垚鍔熼佺粰瀹㈡埛绔簲鐢ㄧ▼搴忥紝姣斿瀵規柟鍙兘鍙戠敓璧勬簮涓嶈凍鐨勬儏鍐碉紝瀵艱嚧AFD.SYS涓嶈兘鎶婃暟鎹嫹璐濈粰搴旂敤紼嬪簭銆傚彟涓涓洿瑕佺揣鐨勯棶棰樻槸錛屽湪姣忎釜綰跨▼涓瘡嬈″彧鑳借繘琛屼竴嬈″彂閫佽皟鐢紝鏁堢巼鏋佸叾浣庝笅銆?/p>

鎶奡O_RCVBUF璁句負0錛屽叧闂瑼FD.SYS鐨勬帴鏀剁紦鍐插尯涔熶笉鑳借鎬ц兘寰楀埌鎻愬崌錛岃繖鍙細榪嬌鎺ユ敹鍒扮殑鏁版嵁鍦ㄦ瘮Winsock鏇翠綆鐨勫眰嬈¤繘琛岀紦鍐詫紝褰撲綘鍙戝嚭receive璋冪敤鏃訛紝鍚屾牱瑕佽繘琛岀紦鍐插尯鎷瘋礉錛屽洜姝や綘鏈潵鎯抽伩鍏嶇紦鍐插尯鎷瘋礉鐨勯槾璋嬩笉浼氬緱閫炪?/p>

鐜板湪鎴戜滑搴旇娓呮浜嗭紝鍏抽棴緙撳啿鍖哄浜庡鏁板簲鐢ㄧ▼搴忚岃█騫朵笉鏄粈涔堝ソ涓繪剰銆傚彧瑕佽搴旂敤紼嬪簭娉ㄦ剰闅忔椂鍦ㄦ煇涓繛鎺ヤ笂淇濇寔鍑犱釜WSARecvs閲嶅彔璋冪敤錛岄偅涔堥氬父娌℃湁蹇呰鍏抽棴鎺ユ敹緙撳啿鍖恒傚鏋淎FD.SYS鎬繪槸鏈夌敱搴旂敤紼嬪簭鎻愪緵鐨勭紦鍐插尯鍙敤錛岄偅涔堝畠灝嗘病鏈夊繀瑕佷嬌鐢ㄥ唴閮ㄧ紦鍐插尯銆?/p>

楂樻ц兘鐨勬湇鍔″櫒搴旂敤紼嬪簭鍙互鍏抽棴鍙戦佺紦鍐插尯錛屽悓鏃朵笉浼氭崯澶辨ц兘銆備笉榪囷紝榪欐牱鐨勫簲鐢ㄧ▼搴忓繀欏誨崄鍒嗗皬蹇冿紝淇濊瘉瀹冩繪槸鍙戝嚭澶氫釜閲嶅彔鍙戦佽皟鐢紝鑰屼笉鏄瓑寰呮煇涓噸鍙犲彂閫佺粨鏉熶簡鎵嶅彂鍑轟笅涓涓傚鏋滃簲鐢ㄧ▼搴忔槸鎸変竴涓彂瀹屽啀鍙戜笅涓涓殑欏哄簭鏉ユ搷浣滐紝閭f氮璐規帀涓ゆ鍙戦佷腑闂寸殑絀烘。鏃墮棿錛屾諱箣鏄淇濊瘉浼犺緭椹卞姩紼嬪簭鍦ㄥ彂閫佸畬涓涓紦鍐插尯鍚庯紝绔嬪埢鍙互杞悜鍙︿竴涓紦鍐插尯銆?/p>

璧勬簮鐨勯檺鍒舵潯浠?/strong>

鍦ㄨ璁′換浣曟湇鍔″櫒搴旂敤紼嬪簭鏃訛紝鍏跺己鍋ユф槸涓昏鐨勭洰鏍囥備篃灝辨槸璇達紝

浣犵殑搴旂敤紼嬪簭瑕佽兘澶熷簲瀵逛換浣曠獊鍙戠殑闂錛屼緥濡傚茍鍙戝鎴瘋姹傛暟杈懼埌宄板箋佸彲鐢ㄥ唴瀛樹復鏃跺嚭鐜頒笉瓚熾佷互鍙婂叾瀹冪煭鏃墮棿鐨勭幇璞°傝繖灝辮姹傜▼搴忕殑璁捐鑰呮敞鎰廤indows NT鍜?000緋葷粺涓嬬殑璧勬簮闄愬埗鏉′歡鐨勯棶棰橈紝浠庡鍦板鐞嗙獊鍙戞т簨浠躲?/p>

浣犲彲浠ョ洿鎺ユ帶鍒剁殑銆佹渶鍩烘湰鐨勮祫婧愬氨鏄綉緇滃甫瀹姐傞氬父錛屼嬌鐢ㄧ敤鎴鋒暟鎹姤鍗忚(UDP)鐨勫簲鐢ㄧ▼搴忛兘鍙兘浼氭瘮杈冩敞鎰忓甫瀹芥柟闈㈢殑闄愬埗錛屼互鏈澶ч檺搴﹀湴鍑忓皯鍖呯殑涓㈠け銆傜劧鑰岋紝鍦ㄤ嬌鐢═CP榪炴帴鏃訛紝鏈嶅姟鍣ㄥ繀欏誨崄鍒嗗皬蹇冨湴鎺у埗濂斤紝闃叉緗戠粶甯﹀榪囪澆瓚呰繃涓瀹氱殑鏃墮棿錛屽惁鍒欏皢闇瑕侀噸鍙戝ぇ閲忕殑鍖呮垨閫犳垚澶ч噺榪炴帴涓柇銆傚叧浜庡甫瀹界鐞嗙殑鏂規硶搴旀牴鎹笉鍚岀殑搴旂敤紼嬪簭鑰屽畾錛岃繖瓚呭嚭浜嗘湰鏂囪璁虹殑鑼冨洿銆?/p>

铏氭嫙鍐呭瓨鐨勪嬌鐢ㄤ篃蹇呴』寰堝皬蹇冨湴綆$悊銆傞氳繃璋ㄦ厧鍦扮敵璇峰拰閲婃斁鍐呭瓨錛屾垨鑰呭簲鐢╨ookaside lists(涓縐嶉珮閫熺紦瀛?鎶鏈潵閲嶆柊浣跨敤宸插垎閰嶇殑鍐呭瓨錛屽皢鏈夊姪浜庢帶鍒舵湇鍔″櫒搴旂敤紼嬪簭鐨勫唴瀛樺紑閿(鍘熸枃涓?#8220;璁╂湇鍔″櫒搴旂敤紼嬪簭鐣欎笅鐨勮剼鍗板皬涓鐐?#8221;)錛岄伩鍏嶆搷浣滅郴緇熼綣佸湴灝嗗簲鐢ㄧ▼搴忕敵璇風殑鐗╃悊鍐呭瓨浜ゆ崲鍒拌櫄鎷熷唴瀛樹腑(鍘熸枃涓?#8220;璁╂搷浣滅郴緇熻兘澶熸繪槸鎶婃洿澶氱殑搴旂敤紼嬪簭鍦板潃絀洪棿鏇村鍦頒繚鐣欏湪鍐呭瓨涓?#8221;)銆備綘涔熷彲浠ラ氳繃SetWorkingSetSize()榪欎釜Win32 API璁╂搷浣滅郴緇熷垎閰嶇粰浣犵殑搴旂敤紼嬪簭鏇村鐨勭墿鐞嗗唴瀛樸?/p>

鍦ㄤ嬌鐢╓insock鏃惰繕鍙兘紕板埌鍙﹀涓や釜闈炵洿鎺ョ殑璧勬簮涓嶈凍鎯呭喌銆備竴涓槸琚攣瀹氱殑鍐呭瓨欏甸潰鐨勬瀬闄愩傚鏋滀綘鎶夾FD.SYS鐨勭紦鍐插叧闂紝褰撳簲鐢ㄧ▼搴忔敹鍙戞暟鎹椂錛屽簲鐢ㄧ▼搴忕紦鍐插尯鐨勬墍鏈夐〉闈㈠皢琚攣瀹氬埌鐗╃悊鍐呭瓨涓傝繖鏄洜涓哄唴鏍擱┍鍔ㄧ▼搴忛渶瑕佽闂繖浜涘唴瀛橈紝鍦ㄦ鏈熼棿榪欎簺欏甸潰涓嶈兘浜ゆ崲鍑哄幓銆傚鏋滄搷浣滅郴緇熼渶瑕佺粰鍏跺畠搴旂敤紼嬪簭鍒嗛厤涓浜涘彲鍒嗛〉鐨勭墿鐞嗗唴瀛橈紝鑰屽張娌℃湁瓚沖鐨勫唴瀛樻椂灝變細鍙戠敓闂銆傛垜浠殑鐩爣鏄闃叉鍐欏嚭涓涓梾鎬佺殑銆侀攣瀹氭墍鏈夌墿鐞嗗唴瀛樸佽緋葷粺宕╂簝鐨勭▼搴忋備篃灝辨槸璇達紝浣犵殑紼嬪簭閿佸畾鍐呭瓨鏃訛紝涓嶈瓚呭嚭緋葷粺瑙勫畾鐨勫唴瀛樺垎欏墊瀬闄愩?/p>

鍦╓indows NT鍜?000緋葷粺涓婏紝鎵鏈夊簲鐢ㄧ▼搴忔誨叡鍙互閿佸畾鐨勫唴瀛樺ぇ綰︽槸鐗╃悊鍐呭瓨鐨?/8(涓嶈繃榪欏彧鏄竴涓ぇ姒傜殑浼拌錛屼笉鏄綘璁$畻鍐呭瓨鐨勪緷鎹?銆傚鏋滀綘鐨勫簲鐢ㄧ▼搴忎笉娉ㄦ剰榪欎竴鐐癸紝褰撲綘鐨勫彂鍑哄お澶氱殑閲嶅彔鏀跺彂璋冪敤錛岃屼笖I/O娌℃潵寰楀強瀹屾垚鏃訛紝灝卞彲鑳藉伓灝斿彂鐢烢RROR_INSUFFICIENT_RESOURCES鐨勯敊璇傚湪榪欑鎯呭喌涓嬩綘瑕侀伩鍏嶈繃搴﹂攣瀹氬唴瀛樸傚悓鏃惰娉ㄦ剰錛岀郴緇熶細閿佸畾鍖呭惈浣犵殑緙撳啿鍖烘墍鍦ㄧ殑鏁翠釜鍐呭瓨欏甸潰錛屽洜姝ょ紦鍐插尯闈犺繎欏佃竟鐣屾椂鏄湁浠d環鐨?璇戣呯悊瑙o紝緙撳啿鍖哄鏋滄濂借秴榪囬〉闈㈣竟鐣岋紝閭f曟槸1涓瓧鑺傦紝瓚呭嚭鐨勮繖涓瓧鑺傛墍鍦ㄧ殑欏甸潰涔熶細琚攣瀹?銆?/p>

鍙﹀涓涓檺鍒舵槸浣犵殑紼嬪簭鍙兘浼氶亣鍒扮郴緇熸湭鍒嗛〉姹犺祫婧愪笉瓚崇殑鎯呭喌銆傛墍璋撴湭鍒嗛〉姹犳槸涓鍧楁案榪滀笉琚氦鎹㈠嚭鍘葷殑鍐呭瓨鍖哄煙錛岃繖鍧楀唴瀛樼敤鏉ュ瓨鍌ㄤ竴浜涗緵鍚勭鍐呮牳緇勪歡璁塊棶鐨勬暟鎹紝鍏朵腑鏈夌殑鍐呮牳緇勪歡鏄笉鑳借闂偅浜涜浜ゆ崲鍑哄幓鐨勯〉闈㈢┖闂寸殑銆俉indows NT鍜?000鐨勯┍鍔ㄧ▼搴忚兘澶熶粠榪欎釜鐗瑰畾鐨勬湭鍒嗛〉姹犲垎閰嶅唴瀛樸?/p>

褰撳簲鐢ㄧ▼搴忓垱寤轟竴涓鎺ュ瓧(鎴栬呮槸綾諱技鐨勬墦寮鏌愪釜鏂囦歡)鏃訛紝鍐呮牳浼氫粠鏈垎欏墊睜涓垎閰嶄竴瀹氭暟閲忕殑鍐呭瓨錛岃屼笖鍦ㄧ粦瀹氥佽繛鎺ュ鎺ュ瓧鏃訛紝鍐呮牳鍙堜細浠庢湭鍒嗛〉姹犱腑鍐嶅垎閰嶄竴浜涘唴瀛樸傚綋浣犳敞鎰忚瀵熻繖縐嶈涓烘椂浣犲皢鍙戠幇錛屽鏋滀綘鍙戝嚭鏌愪簺I/O璇鋒眰鏃?渚嬪鏀跺彂鏁版嵁)錛屼綘浼氫粠鏈垎欏墊睜閲屽啀鍒嗛厤澶氫竴浜涘唴瀛?姣斿瑕佽拷韙煇涓緟鍐崇殑I/O鎿嶄綔錛屼綘鍙兘闇瑕佺粰榪欎釜鎿嶄綔娣誨姞涓涓嚜瀹氫箟緇撴瀯錛屽鍓嶆枃鎵鎻愬強鐨?銆傛渶鍚庤繖灝卞彲鑳戒細閫犳垚涓瀹氱殑闂錛屾搷浣滅郴緇熶細闄愬埗鏈垎欏靛唴瀛樼殑鐢ㄩ噺銆?/p>

鍦╓indows NT鍜?000榪欎袱縐嶆搷浣滅郴緇熶笂錛岀粰姣忎釜榪炴帴鍒嗛厤鐨勬湭鍒嗛〉鍐呭瓨鐨勫叿浣撴暟閲忔槸涓嶅悓鐨勶紝鏈潵鐗堟湰鐨刉indows寰堝彲鑳戒篃涓嶅悓銆備負浜嗕嬌搴旂敤紼嬪簭鐨勭敓鍛芥湡鏇撮暱錛屼綘灝變笉搴旇璁$畻瀵規湭鍒嗛〉姹犲唴瀛樼殑鍏蜂綋闇姹傞噺銆?/p>

浣犵殑紼嬪簭蹇呴』闃叉娑堣楀埌鏈垎欏墊睜鐨勬瀬闄愩傚綋緋葷粺涓湭鍒嗛〉姹犲墿浣欑┖闂村お灝忔椂錛屾煇浜涗笌浣犵殑搴旂敤紼嬪簭姣棤鍏崇郴鐨勫唴鏍擱┍鍔ㄥ氨浼氬彂鐤紝鐢氳嚦閫犳垚緋葷粺宕╂簝錛岀壒鍒槸褰撶郴緇熶腑鏈夌涓夋柟璁懼鎴栭┍鍔ㄧ▼搴忔椂錛屾洿瀹規槗鍙戠敓榪欐牱鐨勬儴鍓?鑰屼笖鏃犳硶棰勬祴)銆傚悓鏃朵綘榪樿璁頒綇錛屽悓涓鍙扮數鑴戜笂榪樺彲鑳借繍琛屾湁鍏跺畠鍚屾牱娑堣楁湭鍒嗛〉姹犵殑鍏跺畠搴旂敤紼嬪簭錛屽洜姝ゅ湪璁捐浣犵殑搴旂敤紼嬪簭鏃訛紝瀵硅祫婧愰噺鐨勯浼拌鐗瑰埆淇濆畧鍜岃皚鎱庛?/p>

澶勭悊璧勬簮涓嶈凍鐨勯棶棰樻槸鍗佸垎澶嶆潅鐨勶紝鍥犱負鍙戠敓涓婅堪鎯呭喌鏃朵綘涓嶄細鏀跺埌鐗瑰埆鐨勯敊璇唬鐮侊紝閫氬父浣犲彧鑳芥敹鍒頒竴鑸х殑WSAENOBUFS鎴栬匛RROR_INSUFFICIENT_RESOURCES 閿欒銆傝澶勭悊榪欎簺閿欒錛岄鍏堬紝鎶婁綘鐨勫簲鐢ㄧ▼搴忓伐浣滈厤緗皟鏁村埌鍚堢悊鐨勬渶澶у?璇戣呮敞錛氭墍璋撳伐浣滈厤緗紝鏄寚搴旂敤紼嬪簭鍚勯儴鍒嗚繍琛屼腑鎵闇鐨勫唴瀛樼敤閲忥紝璇峰弬鑰?http://msdn.microsoft.com/msdnmag/issues/1000/Bugslayer/Bugslayer1000.asp 錛屽叧浜庡唴瀛樹紭鍖栵紝璇戣呭彟鏈夎瘧鏂?錛屽鏋滈敊璇戶緇嚭鐜幫紝閭d箞娉ㄦ剰媯鏌ユ槸鍚︽槸緗戠粶甯﹀涓嶈凍鐨勯棶棰樸備箣鍚庯紝璇風‘璁や綘娌℃湁鍚屾椂鍙戝嚭澶鐨勬敹鍙戣皟鐢ㄣ傛渶鍚庯紝濡傛灉榪樻槸鏀跺埌璧勬簮涓嶈凍鐨勯敊璇紝閭e氨寰堝彲鑳芥槸閬囧埌浜嗘湭鍒嗛〉鍐呭瓨姹犱笉瓚崇殑闂浜嗐傝閲婃斁鏈垎欏靛唴瀛樻睜絀洪棿錛岃鍏抽棴搴旂敤紼嬪簭涓浉褰撻儴鍒嗙殑榪炴帴錛岀瓑寰呯郴緇熻嚜琛屾浮榪囧拰淇榪欎釜鐬椂鐨勯敊璇?br>
鎺ュ彈榪炴帴璇鋒眰

鏈嶅姟鍣ㄨ鍋氱殑鏈鏅氱殑浜嬫儏涔嬩竴灝辨槸鎺ュ彈鏉ヨ嚜瀹㈡埛绔殑榪炴帴璇鋒眰銆傚湪濂楁帴瀛椾笂浣跨敤閲嶅彔I/O鎺ュ彈榪炴帴鐨勬儫涓API灝辨槸AcceptEx()鍑芥暟銆傛湁瓚g殑鏄紝閫氬父鐨勫悓姝ユ帴鍙楀嚱鏁癮ccept()鐨勮繑鍥炲兼槸涓涓柊鐨勫鎺ュ瓧錛岃孉cceptEx()鍑芥暟鍒欓渶瑕佸彟澶栦竴涓鎺ュ瓧浣滀負瀹冪殑鍙傛暟涔嬩竴銆傝繖鏄洜涓篈cceptEx()鏄竴涓噸鍙犳搷浣滐紝鎵浠ヤ綘闇瑕佷簨鍏堝垱寤轟竴涓鎺ュ瓧(浣嗕笉瑕佺粦瀹氭垨榪炴帴瀹?錛屽茍鎶婅繖涓鎺ュ瓧閫氳繃鍙傛暟浼犵粰AcceptEx()銆備互涓嬫槸涓灝忔鍏稿瀷鐨勪嬌鐢ˋcceptEx()鐨勪吉浠g爜錛?

do {
-絳夊緟涓婁竴涓?AcceptEx 瀹屾垚
-鍒涘緩涓涓柊濂楁帴瀛楀茍涓庡畬鎴愮鍙h繘琛屽叧鑱?
-璁劇疆鑳屾櫙緇撴瀯絳夌瓑
-鍙戝嚭涓涓?AcceptEx 璇鋒眰
}while(TRUE);
浣滀負涓涓珮鍝嶅簲鑳藉姏鐨勬湇鍔″櫒錛屽畠蹇呴』鍙戝嚭瓚沖鐨凙cceptEx璋冪敤錛屽畧鍊欑潃錛屼竴鏃﹀嚭鐜板鎴風榪炴帴璇鋒眰灝辯珛鍒誨搷搴斻傝嚦浜庡彂鍑哄灝戜釜AcceptEx鎵嶅錛屽氨鍙栧喅浜庝綘鐨勬湇鍔″櫒紼嬪簭鎵鏈熷緟鐨勯氫俊浜ら氱被鍨嬨傛瘮濡傦紝濡傛灉榪涘叆榪炴帴鐜囬珮鐨勬儏鍐?鍥犱負榪炴帴鎸佺畫鏃墮棿杈冪煭錛屾垨鑰呭嚭鐜頒氦閫氶珮宄?錛岄偅涔堟墍闇瑕佸畧鍊欑殑AcceptEx褰撶劧瑕佹瘮閭d簺鍋跺皵榪涘叆鐨勫鎴風榪炴帴鐨勬儏鍐佃澶氥傝仾鏄庣殑鍋氭硶鏄紝鐢卞簲鐢ㄧ▼搴忔潵鍒嗘瀽浜ら氱姸鍐碉紝騫惰皟鏁碅cceptEx瀹堝欑殑鏁伴噺錛岃屼笉鏄浐瀹氬湪鏌愪釜鏁伴噺涓娿?

瀵逛簬Windows2000錛學insock鎻愪緵浜嗕竴浜涙満鍒訛紝甯姪浣犲垽瀹欰cceptEx鐨勬暟閲忔槸鍚﹁凍澶熴傝繖灝辨槸錛屽湪鍒涘緩鐩戝惉濂楁帴瀛楁椂鍒涘緩涓涓簨浠訛紝閫氳繃WSAEventSelect()榪欎釜API騫舵敞鍐孎D_ACCEPT浜嬩歡閫氱煡鏉ユ妸濂楁帴瀛楀拰榪欎釜浜嬩歡鍏寵仈璧鋒潵銆備竴鏃︾郴緇熸敹鍒頒竴涓繛鎺ヨ姹傦紝濡傛灉緋葷粺涓病鏈堿cceptEx()姝e湪絳夊緟鎺ュ彈榪炴帴錛岄偅涔堜笂闈㈢殑浜嬩歡灝嗘敹鍒頒竴涓俊鍙楓傞氳繃榪欎釜浜嬩歡錛屼綘灝卞彲浠ュ垽鏂綘鏈夋病鏈夊彂鍑鴻凍澶熺殑AcceptEx()錛屾垨鑰呮嫻嬪嚭涓涓潪姝e父鐨勫鎴瘋姹?涓嬫枃榪?銆傝繖縐嶆満鍒跺Windows NT 4.0涓嶉傜敤銆?/p>

浣跨敤AcceptEx()鐨勪竴澶уソ澶勬槸錛屼綘鍙互閫氳繃涓嬈¤皟鐢ㄥ氨瀹屾垚鎺ュ彈瀹㈡埛绔繛鎺ヨ姹傚拰鎺ュ彈鏁版嵁(閫氳繃浼犻乴pOutputBuffer鍙傛暟)涓や歡浜嬫儏銆備篃灝辨槸璇達紝濡傛灉瀹㈡埛绔湪鍙戝嚭榪炴帴鐨勫悓鏃朵紶杈撴暟鎹紝浣犵殑AcceptEx()璋冪敤鍦ㄨ繛鎺ュ垱寤哄茍鎺ユ敹浜嗗鎴風鏁版嵁鍚庡氨鍙互绔嬪埢榪斿洖銆傝繖鏍峰彲鑳芥槸寰堟湁鐢ㄧ殑錛屼絾鏄篃鍙兘浼氬紩鍙戦棶棰橈紝鍥犱負AcceptEx()蹇呴』絳夊叏閮ㄥ鎴風鏁版嵁閮芥敹鍒頒簡鎵嶈繑鍥炪傚叿浣撴潵璇達紝濡傛灉浣犲湪鍙戝嚭AcceptEx()璋冪敤鐨勫悓鏃朵紶閫掍簡lpOutputBuffer鍙傛暟錛岄偅涔圓cceptEx()涓嶅啀鏄竴欏瑰師瀛愬瀷鐨勬搷浣滐紝鑰屾槸鍒嗘垚浜嗕袱姝ワ細鎺ュ彈瀹㈡埛榪炴帴錛岀瓑寰呮帴鏀舵暟鎹傚綋緙哄皯涓縐嶆満鍒舵潵閫氱煡浣犵殑搴旂敤紼嬪簭鎵鍙戠敓鐨勮繖縐嶆儏鍐碉細“榪炴帴宸茬粡寤虹珛浜嗭紝姝e湪絳夊緟瀹㈡埛绔暟鎹?#8221;錛岃繖灝嗘剰鍛崇潃鏈夊彲鑳藉嚭鐜板鎴風鍙彂鍑鴻繛鎺ヨ姹傦紝浣嗘槸涓嶅彂閫佹暟鎹傚鏋滀綘鐨勬湇鍔″櫒鏀跺埌澶榪欑綾誨瀷鐨勮繛鎺ユ椂錛屽畠灝嗘嫆緇濊繛鎺ユ洿澶氱殑鍚堟硶瀹㈡埛绔姹傘傝繖灝辨槸榛戝榪涜“鎷掔粷鏈嶅姟”鏀誨嚮鐨勫父瑙佹墜娉曘?/p>

瑕侀闃叉綾繪敾鍑伙紝鎺ュ彈榪炴帴鐨勭嚎紼嬪簲璇ヤ笉鏃跺湴閫氳繃璋冪敤getsockopt()鍑芥暟(閫夐」鍙傛暟涓篠O_CONNECT_TIME)鏉ユ鏌cceptEx()閲屽畧鍊欑殑濂楁帴瀛椼俫etsockopt()鍑芥暟鐨勯夐」鍊煎皢琚緗負濂楁帴瀛楄榪炴帴鐨勬椂闂達紝鎴栬呰緗負-1(浠h〃濂楁帴瀛楀皻鏈緩绔嬭繛鎺?銆傝繖鏃訛紝WSAEventSelect()鐨勭壒鎬у氨鍙互寰堝ソ鍦板埄鐢ㄦ潵鍋氳繖縐嶆鏌ャ傚鏋滃彂鐜拌繛鎺ュ凡緇忓緩绔嬶紝浣嗘槸寰堜箙閮芥病鏈夋敹鍒版暟鎹殑鎯呭喌錛岄偅涔堝氨搴旇緇堟榪炴帴錛屾柟娉曞氨鏄叧闂綔涓哄弬鏁版彁渚涚粰AcceptEx()鐨勯偅涓鎺ュ瓧銆傛敞鎰忥紝鍦ㄥ鏁伴潪绱фユ儏鍐典笅錛屽鏋滃鎺ュ瓧宸茬粡浼犻掔粰AcceptEx()騫跺紑濮嬪畧鍊欙紝浣嗚繕鏈緩绔嬭繛鎺ワ紝閭d箞浣犵殑搴旂敤紼嬪簭涓嶅簲璇ュ叧闂畠浠傝繖鏄洜涓哄嵆浣垮叧闂簡榪欎簺濂楁帴瀛楋紝鍑轟簬鎻愰珮緋葷粺鎬ц兘鐨勮冭檻錛屽湪榪炴帴榪涘叆涔嬪墠錛屾垨鑰呯洃鍚鎺ュ瓧鑷韓琚叧闂箣鍓嶏紝鐩稿簲鐨勫唴鏍告ā寮忕殑鏁版嵁緇撴瀯涔熶笉浼氳騫插噣鍦版竻闄ゃ?/p>

鍙戝嚭AcceptEx()璋冪敤鐨勭嚎紼嬶紝浼間箮涓庨偅涓繘琛屽畬鎴愮鍙e叧鑱旀搷浣溿佸鐞嗗叾瀹僆/O瀹屾垚閫氱煡鐨勭嚎紼嬫槸鍚屼竴涓紝浣嗘槸錛屽埆蹇樿綰跨▼閲屽簲璇ュ敖鍔涢伩鍏嶆墽琛岄樆濉炲瀷鐨勬搷浣溿俉insock2鍒嗗眰緇撴瀯鐨勪竴涓壇浣滅敤鏄皟鐢╯ocket()鎴朩SASocket() API鐨勪笂灞傛灦鏋勫彲鑳藉緢閲嶈(璇戣呬笉澶槑鐧藉師鏂囨剰鎬濓紝鎶辨瓑)銆傛瘡涓狝cceptEx()璋冪敤閮介渶瑕佸垱寤轟竴涓柊濂楁帴瀛楋紝鎵浠ユ渶濂芥湁涓涓嫭绔嬬殑綰跨▼涓撻棬璋冪敤AcceptEx()錛岃屼笉鍙備笌鍏跺畠I/O澶勭悊銆備綘涔熷彲浠ュ埄鐢ㄨ繖涓嚎紼嬫潵鎵ц鍏跺畠浠誨姟錛屾瘮濡備簨浠惰褰曘?/p>

鏈夊叧AcceptEx()鐨勬渶鍚庝竴涓敞鎰忎簨欏癸細瑕佸疄鐜拌繖浜汚PI錛屽茍涓嶉渶瑕佸叾瀹冩彁渚涘晢鎻愪緵鐨刉insock2瀹炵幇銆傝繖涓鐐瑰寰蔣鐗規湁鐨勫叾瀹傾PI涔熷悓鏍烽傜敤錛屾瘮濡俆ransmitFile()鍜孏etAcceptExSockAddrs()錛屼互鍙婂叾瀹冨彲鑳戒細琚姞鍏ュ埌鏂扮増Windows鐨凙PI. 鍦╓indows NT鍜?000涓婏紝榪欎簺API鏄湪寰蔣鐨勫簳灞傛彁渚涜匘LL(mswsock.dll)涓疄鐜扮殑錛屽彲閫氳繃涓巑swsock.lib緙栬瘧榪炴帴榪涜璋冪敤錛屾垨鑰呴氳繃WSAIoctl() (閫夐」鍙傛暟涓篠IO_GET_EXTENSION_FUNCTION_POINTER)鍔ㄦ佽幏寰楀嚱鏁扮殑鎸囬拡銆?/p>

濡傛灉鍦ㄦ病鏈変簨鍏堣幏寰楀嚱鏁版寚閽堢殑鎯呭喌涓嬬洿鎺ヨ皟鐢ㄥ嚱鏁?涔熷氨鏄錛岀紪璇戞椂闈欐佽繛鎺swsock.lib錛屽湪紼嬪簭涓洿鎺ヨ皟鐢ㄥ嚱鏁?錛岄偅涔堟ц兘灝嗗緢鍙楀獎鍝嶃傚洜涓篈cceptEx()琚疆浜嶹insock2鏋舵瀯涔嬪錛屾瘡嬈¤皟鐢ㄦ椂瀹冮兘琚揩閫氳繃WSAIoctl()鍙栧緱鍑芥暟鎸囬拡銆傝閬垮厤榪欑鎬ц兘鎹熷け錛岄渶瑕佷嬌鐢ㄨ繖浜汚PI鐨勫簲鐢ㄧ▼搴忓簲璇ラ氳繃璋冪敤WSAIoctl()鐩存帴浠庡簳灞傜殑鎻愪緵鑰呴偅閲屽彇寰楀嚱鏁扮殑鎸囬拡銆?br>
鍙傝涓嬪浘濂楁帴瀛楁灦鏋勶細



TransmitFile 鍜?TransmitPackets

Winsock 鎻愪緵涓や釜涓撻棬涓烘枃浠跺拰鍐呭瓨鏁版嵁浼犺緭榪涜浜嗕紭鍖栫殑鍑芥暟銆傚叾涓璗ransmitFile()榪欎釜API鍑芥暟鍦╓indows NT 4.0 鍜?Windows 2000涓婇兘鍙互浣跨敤錛岃孴ransmitPackets()鍒欏皢鍦ㄦ湭鏉ョ増鏈殑Windows涓疄鐜般?/p>

TransmitFile()鐢ㄦ潵鎶婃枃浠跺唴瀹歸氳繃Winsock榪涜浼犺緭銆傞氬父鍙戦佹枃浠剁殑鍋氭硶鏄紝鍏堣皟鐢–reateFile()鎵撳紑涓涓枃浠訛紝鐒跺悗涓嶆柇寰幆璋冪敤ReadFile() 鍜學SASend ()鐩磋嚦鏁版嵁鍙戦佸畬姣曘備絾鏄繖縐嶆柟娉曞緢娌℃湁鏁堢巼錛屽洜涓烘瘡嬈¤皟鐢≧eadFile() 鍜?WSASend ()閮戒細娑夊強涓嬈′粠鐢ㄦ埛妯″紡鍒板唴鏍告ā寮忕殑杞崲銆傚鏋滄崲鎴怲ransmitFile()錛岄偅涔堝彧闇瑕佺粰瀹冧竴涓凡鎵撳紑鏂囦歡鐨勫彞鏌勫拰瑕佸彂閫佺殑瀛楄妭鏁幫紝鑰屾墍娑夊強鐨勬ā寮忚漿鎹㈡搷浣滃皢鍙湪璋冪敤CreateFile()鎵撳紑鏂囦歡鏃跺彂鐢熶竴嬈★紝鐒跺悗TransmitFile()鏃跺啀鍙戠敓涓嬈°傝繖鏍鋒晥鐜囧氨楂樺浜嗐?/p>

TransmitPackets()姣擳ransmitFile()鏇磋繘涓姝ワ紝瀹冨厑璁哥敤鎴峰彧璋冪敤涓嬈″氨鍙互鍙戦佹寚瀹氱殑澶氫釜鏂囦歡鍜屽唴瀛樼紦鍐插尯銆傚嚱鏁板師鍨嬪涓嬶細

BOOL TransmitPackets(
SOCKET hSocket,
LPTRANSMIT_PACKET_ELEMENT lpPacketArray,
DWORD nElementCount,
DWORD nSendSize,
LPOVERLAPPED lpOverlapped,
DWORD dwFlags
); 
鍏朵腑錛宭pPacketArray鏄竴涓粨鏋勭殑鏁扮粍錛屽叾涓殑姣忎釜鍏冪礌鏃㈠彲浠ユ槸涓涓枃浠跺彞鏌勬垨鑰呭唴瀛樼紦鍐插尯錛岃緇撴瀯瀹氫箟濡備笅錛?br>
typedef struct _TRANSMIT_PACKETS_ELEMENT {
DWORD dwElFlags;
DWORD cLength;
union {
struct {
LARGE_INTEGER     nFileOffset;
HANDLE            hFile;
};
PVOID             pBuffer;
};
} TRANSMIT_FILE_BUFFERS;
鍏朵腑鍚勫瓧孌墊槸鑷弿榪板瀷鐨?self explanatory)銆?br>dwElFlags瀛楁錛氭寚瀹氬綋鍓嶅厓绱犳槸涓涓枃浠跺彞鏌勮繕鏄唴瀛樼紦鍐插尯(鍒嗗埆閫氳繃甯擱噺TF_ELEMENT_FILE 鍜孴F_ELEMENT_MEMORY鎸囧畾)錛?br>cLength瀛楁錛氭寚瀹氬皢浠庢暟鎹簮鍙戦佺殑瀛楄妭鏁?濡傛灉鏄枃浠訛紝榪欎釜瀛楁鍊間負0琛ㄧず鍙戦佹暣涓枃浠?錛?br>緇撴瀯涓殑鏃犲悕鑱斿悎浣擄細鍖呭惈鏂囦歡鍙ユ焺鐨勫唴瀛樼紦鍐插尯(浠ュ強鍙兘鐨勫亸縐婚噺)銆?

浣跨敤榪欎袱涓狝PI鐨勫彟涓涓ソ澶勶紝鏄彲浠ラ氳繃鎸囧畾TF_REUSE_SOCKET鍜孴F_DISCONNECT鏍囧織鏉ラ噸鐢ㄥ鎺ュ瓧鍙ユ焺銆傛瘡褰揂PI瀹屾垚鏁版嵁鐨勪紶杈撳伐浣滃悗錛屽氨浼氬湪浼犺緭灞傜駭鍒柇寮榪炴帴錛岃繖鏍瘋繖涓鎺ュ瓧灝卞張鍙互閲嶆柊鎻愪緵緇橝cceptEx()浣跨敤銆傞噰鐢ㄨ繖縐嶄紭鍖栫殑鏂規硶緙栫▼錛屽皢鍑忚交閭d釜涓撻棬鍋氭帴鍙楁搷浣滅殑綰跨▼鍒涘緩濂楁帴瀛楃殑鍘嬪姏(鍓嶆枃榪板強)銆?/p>

榪欎袱涓狝PI涔熼兘鏈変竴涓叡鍚岀殑寮辯偣錛歐indows NT Workstation 鎴?Windows 2000 涓撲笟鐗堜腑錛屽嚱鏁版瘡嬈″彧鑳藉鐞嗕袱涓皟鐢ㄨ姹傦紝鍙湁鍦╓indows NT銆乄indows 2000鏈嶅姟鍣ㄧ増銆乄indows 2000楂樼駭鏈嶅姟鍣ㄧ増鎴?Windows 2000 Data Center涓墠鑾峰緱瀹屽叏鏀寔銆?/p>

鏀懼湪涓璧風湅鐪?/strong>

浠ヤ笂鍚勮妭涓紝鎴戜滑璁ㄨ浜嗗紑鍙戦珮鎬ц兘鐨勩佸ぇ鍝嶅簲瑙勬ā鐨勫簲鐢ㄧ▼搴忔墍闇鐨勫嚱鏁般佹柟娉曞拰鍙兘閬囧埌鐨勮祫婧愮摱棰堥棶棰樸傝繖浜涘浣犳剰鍛崇潃浠涔堝憿錛熷叾瀹烇紝榪欏彇鍐充簬浣犲浣曟瀯閫犱綘鐨勬湇鍔″櫒鍜屽鎴風銆傚綋浣犺兘澶熷湪鏈嶅姟鍣ㄥ拰瀹㈡埛绔璁′笂榪涜鏇村ソ鍦版帶鍒舵椂錛岄偅涔堜綘瓚婅兘澶熼伩寮鐡墮闂銆?/p>

鏉ョ湅涓涓ず鑼冪殑鐜銆傛垜浠璁捐涓涓湇鍔″櫒鏉ュ搷搴斿鎴風鐨勮繛鎺ャ佸彂閫佽姹傘佹帴鏀舵暟鎹互鍙婃柇寮榪炴帴銆傞偅涔堬紝鏈嶅姟鍣ㄥ皢闇瑕佸垱寤轟竴涓洃鍚鎺ュ瓧錛屾妸瀹冧笌鏌愪釜瀹屾垚绔彛榪涜鍏寵仈錛屼負姣忛CPU鍒涘緩涓涓伐浣滅嚎紼嬨傚啀鍒涘緩涓涓嚎紼嬩笓闂ㄧ敤鏉ュ彂鍑篈cceptEx()銆傛垜浠煡閬撳鎴風浼氬湪鍙戝嚭榪炴帴璇鋒眰鍚庣珛鍒諱紶閫佹暟鎹紝鎵浠ュ鏋滄垜浠噯澶囧ソ鎺ユ敹緙撳啿鍖轟細浣夸簨鎯呭彉寰楁洿涓哄鏄撱傚綋鐒訛紝涓嶈蹇樿涓嶆椂鍦拌疆璇cceptEx()璋冪敤涓嬌鐢ㄧ殑濂楁帴瀛?浣跨敤SO_CONNECT_TIME閫夐」鍙傛暟)鏉ョ‘淇濇病鏈夋伓鎰忚秴鏃剁殑榪炴帴銆?/p>

璇ヨ璁′腑鏈変竴涓噸瑕佺殑闂瑕佽冭檻錛屾垜浠簲璇ュ厑璁稿灝戜釜AcceptEx()榪涜瀹堝欍傝繖鏄洜涓猴紝姣忓彂鍑轟竴涓狝cceptEx()鏃舵垜浠兘鍚屾椂闇瑕佷負瀹冩彁渚涗竴涓帴鏀剁紦鍐插尯錛岄偅涔堝唴瀛樹腑灝嗕細鍑虹幇寰堝琚攣瀹氱殑欏甸潰(鍓嶆枃璇磋繃浜嗭紝姣忎釜閲嶅彔鎿嶄綔閮戒細娑堣椾竴灝忛儴鍒嗘湭鍒嗛〉鍐呭瓨姹狅紝鍚屾椂榪樹細閿佸畾鎵鏈夋秹鍙婄殑緙撳啿鍖?銆傝繖涓棶棰樺緢闅懼洖絳旓紝娌℃湁涓涓‘鍒囩殑絳旀銆傛渶濂界殑鏂規硶鏄妸榪欎釜鍊煎仛鎴愬彲浠ヨ皟鏁寸殑錛岄氳繃鍙嶅鍋氭ц兘嫻嬭瘯錛屼綘灝卞彲浠ュ緱鍑哄湪鍏稿瀷搴旂敤鐜涓渶浣崇殑鍊箋?/p>

濂戒簡錛屽綋浣犳祴綆楁竻妤氬悗錛屼笅闈㈠氨鏄彂閫佹暟鎹殑闂浜嗭紝鑰冭檻鐨勯噸鐐規槸浣犲笇鏈涙湇鍔″櫒鍚屾椂澶勭悊澶氬皯涓茍鍙戠殑榪炴帴銆傞氬父鎯呭喌涓嬶紝鏈嶅姟鍣ㄥ簲璇ラ檺鍒跺茍鍙戣繛鎺ョ殑鏁伴噺浠ュ強絳夊欏鐞嗙殑鍙戦佽皟鐢ㄣ傚洜涓哄茍鍙戣繛鎺ユ暟閲忚秺澶氾紝鎵娑堣楃殑鏈垎欏靛唴瀛樻睜涔熻秺澶氾紱絳夊欏鐞嗙殑鍙戦佽皟鐢ㄨ秺澶氾紝琚攣瀹氱殑鍐呭瓨欏甸潰涔熻秺澶?灝忓績鍒秴榪囦簡鏋侀檺)銆傝繖鍚屾牱涔熼渶瑕佸弽澶嶆祴璇曟墠鐭ラ亾絳旀銆?/p>

瀵逛簬涓婅堪鐜錛岄氬父涓嶉渶瑕佸叧闂崟涓鎺ュ瓧鐨勭紦鍐插尯錛屽洜涓哄彧鍦ˋcceptEx()涓湁涓嬈℃帴鏀舵暟鎹殑鎿嶄綔錛岃岃淇濊瘉緇欐瘡涓埌鏉ョ殑榪炴帴鎻愪緵鎺ユ敹緙撳啿鍖哄茍涓嶆槸澶毦鐨勪簨鎯呫備絾鏄紝濡傛灉瀹㈡埛鏈轟笌鏈嶅姟鍣ㄤ氦浜掔殑鏂瑰紡鍙樹竴鍙橈紝瀹㈡埛鏈哄湪鍙戦佷簡涓嬈℃暟鎹箣鍚庯紝榪橀渶瑕佸彂閫佹洿澶氱殑鏁版嵁錛屽湪榪欑鎯呭喌涓嬪叧闂帴鏀剁紦鍐插氨涓嶅お濡欎簡錛岄櫎闈炰綘鎯沖姙娉曚繚璇佸湪姣忎釜榪炴帴涓婇兘鍙戝嚭浜嗛噸鍙犳帴鏀惰皟鐢ㄦ潵鎺ユ敹鏇村鐨勬暟鎹?/p>

緇撹

寮鍙戝ぇ鍝嶅簲瑙勬ā鐨刉insock鏈嶅姟鍣ㄥ茍涓嶆槸寰堝彲鎬曪紝鍏跺疄涔熷氨鏄緗竴涓洃鍚鎺ュ瓧銆佹帴鍙楄繛鎺ヨ姹傚拰榪涜閲嶅彔鏀跺彂璋冪敤銆傞氳繃璁劇疆鍚堢悊鐨勮繘琛屽畧鍊欑殑閲嶅彔璋冪敤鐨勬暟閲忥紝闃叉鍑虹幇鏈垎欏靛唴瀛樻睜琚楀敖錛岃繖鎵嶆槸鏈涓昏鐨勬寫鎴樸傛寜鐓ф垜浠墠闈㈣璁虹殑涓浜涘師鍒欙紝浣犲氨鍙互寮鍙戝嚭澶у搷搴旇妯$殑鏈嶅姟鍣ㄥ簲鐢ㄧ▼搴忋?br>



jay 2007-04-19 14:05 鍙戣〃璇勮
]]>
Overlapped I/Ohttp://m.shnenglu.com/yishanhante/articles/21606.htmljayjayTue, 10 Apr 2007 10:06:00 GMThttp://m.shnenglu.com/yishanhante/articles/21606.htmlhttp://m.shnenglu.com/yishanhante/comments/21606.htmlhttp://m.shnenglu.com/yishanhante/articles/21606.html#Feedback0http://m.shnenglu.com/yishanhante/comments/commentRss/21606.htmlhttp://m.shnenglu.com/yishanhante/services/trackbacks/21606.html閲嶅彔I/O涔熸槸涓縐嶅紓姝/O,鍚屾牱涔熸敮鎸乄in32鐨勫叾瀹冨璞?褰撶劧鍦╓insock涓彲浠ュ彂鎸ュ緢澶х殑浣滅敤銆備嬌鐢∣verlapped寮鍙戞敮鎸佷竴瀹氭暟閲忕殑Socket鐨勫簲鐢紝鏁堢巼鏄浉褰撳緢楂樼殑銆備絾灝辨垜涓漢鐨勮鐐癸紝鍦╓in32涓嬪仛緗戠粶搴旂敤鐨勫紑鍙戯紝濡傛灉瑕佹敮鎸?00涓互涓婄殑Socket鐨勮瘽錛岃繕鏄冭檻Completion Port I/O銆傝姹傛敮鎸丼ocket鏈濂芥槸100涓互涓嬶紝鎴戞槸鍩轟簬榪欐牱鑰冭檻鐨勶細Overlapped鏄氳繃澶氱嚎紼嬫敮鎸佸Socket鐨勶紝濡傛灉寮杈熺殑綰跨▼澶鐨勮瘽錛屽娍蹇呭獎鍝嶄簡緋葷粺鐨勬ц兘錛汣ompletion Port I/O鍙互鏇村ソ鏀寔澶ч噺鐨勫鎴風銆傝繖涓ょ鍦╓indows涓嬪叿鏈夐珮鏁堢巼鐨処/O閮戒笉鏀寔Windows CE鍙婂叾瀹冨鉤鍙般傛垜鍦ㄨ繖閲岃涓涓嬪湪寮鍙戠綉緇滃簲鐢ㄦ椂浠涔堟椂鍊欑敤Overlapped I/O 妯″瀷錛氬噯澶囧湪Win98鍜屼互涓婄増鏈垨WinNT3.1鍜屼互涓婄増鏈仛寮鍙戯紝涓旇姹傛敮鎸丼ocket鏈濂藉湪100涓互涓嬨傚彟澶栧湪涓插彛寮鍙戜腑錛岃冭檻鏁堢巼闂錛屾湁寰堝鍦版柟鐢ㄥ埌浜哋verlapped I/O銆?br>         Overlapped I/O涓昏娑夊強涓涓暟鎹粨鏋凮verlapped(Winsock涓槸WSAOverlapped)鍜屼竴涓嚱鏁癢SAGetOverlappedResult(..)銆?br>         Overlapped I/O鎵ц姝ラ寰堟竻鏅幫紝鍙涓嬮潰涓夋錛?br>         (1) 搴旂敤鍏堥氳繃WSASend鎴朩SARecv(涓嶇煡閬撴湁娌℃湁鍏跺畠鐨勮姹傦紝鎴戝彧鐢ㄨ繃榪欎袱涓嚱鏁?錛屾敞鎰忚鍚戜袱鑰呰漿鍏SAOverlapped鍙傛暟錛?br>琛ㄧず錛屾墽琛岀殑鏄疧verlapped鎿嶄綔錛?br>         (2)鍦ㄤ竴涓驚鐜腑錛岃皟鐢℅etOverlappedResult(..)絳夊緟鎿嶄綔瀹屾垚錛孏etOverlappedResult榪斿洖鏃訛紝榪涜鐩稿簲鐨勫鐞嗭紝濡傚鐞嗘暟鎹紱
         (3) 鏈鍚庯紝榪樺湪(2)寰幆涓紝鍙戦佸彟澶栦竴涓姹?WSASend鎴朩SARecv),閲嶅澶勭悊(2)銆?3)涓ゆ銆?br>        絎竴姝ヤ腑鎵цWSASend鎴朩SARecv鏃訛紝鍑芥暟绔嬪嵆榪斿洖錛屽緱鍒癝OCKET_ERROR淇℃伅涓旀鏃禬SAGetErrorLast榪斿洖WSA_IO_PENDING錛岃鏄庤皟鐢ㄥ凡鎴愬姛錛學insock姝e湪澶勭悊WSASend鎴朩SARecv鐨勮姹傘備釜浜鴻涓篧insock鍦ㄥ唴閮ㄥ紑杈熶簡鏂扮殑綰跨▼澶勭悊錛屽簲鐢ㄧ▼搴忎笉鐢ㄧ鐞嗗綰跨▼錛岃揪鍒板紓姝ョ殑鐩殑錛屾湁鍒╀簬鎬ц兘鐨勬彁楂樸俉SASend鎴朩SARecv涔熷彲鑳借繑鍥?0"錛岃〃紺虹珛鍗蟲垚鍔燂紝榪欐椂錛屽簲鐢ㄨ繕鏄彲浠ュ湪WSAGetOverlappedResult()澶勭瓑寰咃紝澶勭悊榪囩▼涓庝笂闈㈡槸涓鏍風殑錛涗篃灝辨槸璇存垜浠笉欏昏椹笂鍦╓SASend鎴朩SARecv榪涜鐩稿叧鐨勫鐞嗐?br>        WSAGetOverlappedResult榪斿洖FASLE涓擶SAGetLastError榪斿洖WSA_IO_INCOMPLETE錛岃〃紺哄鐞嗘鍦ㄨ繘琛屼腑銆?nbsp;  

        涓嬮潰鎴戠粰鍑烘敮鎸佸崟涓猄ocket鍙婃敮鎸佸涓猄ocket鐨凜onsole紼嬪簭浠g爜銆傚厛鏉ョ湅鐪嬫敮鎸佸崟涓猄ocket鐨勭▼搴?鑰冭檻鍒頒唬鐮佺畝媧佹э紝鍙粰涓涓鏋訛紝鍚屾椂涓嶈繘琛屽嚭閿欏鐞嗐?br>int main()
{
          WSAOVERLAPPED     Overlapped;
                  
          // 鍚姩Winsock鍙婂緩绔嬬洃鍚鎺ュ瓧
           listen(hListenSocket,  5);
       
           hClientSocket   =   accept(hListenSocket,   NULL,   NULL);
           ZeroMemory(&Overlapped,   sizeof(WSAOVERLAPPED));
           
           nResult   =   WSARecv(...);    // 鍙戝嚭璇鋒眰
        
          for (; ;)
          {
                   bResult   =   WSAGetOverlappedResult(...);
                   // 鍑芥暟榪斿洖鍚庤繘琛岀浉搴旂殑澶勭悊
                   nResult   =   WSARecv(...);  // 鍙戝嚭鍙﹀涓涓姹?br>          }
}
        涓婇潰鐨勭▼搴忓彧鏄兂璇存槑涓涓嬭繃紼嬶紝紼嬪簭娌℃湁瀹炵幇浠涔堝姛鑳姐傝繖鏍峰仛鐨勭洰鐨勬槸鑺傜害瀛楁暟錛岀敤鏉ヨ鏄庢垜涓嬮潰鏀寔澶氫釜Socket鐨凜onsole搴旂敤銆傝緇х畫鐪嬨?br>        鍏堢湅涓涓嚜瀹氫箟鐨勭粨鏋勪綋錛屽崟鍙ユ焺鏁版嵁緇撴瀯錛岄氳繃璇ョ粨鏋?涓葷嚎紼嬩笌鏌愪釜鐗瑰畾鐨勫瓙綰跨▼涓殑濂楁帴瀛楃浉浜掕仈緋匯?br>         typedef   struct    _PER_HANDLE_DATA
         {
                   SOCKET   hSocket;     // 涓婚敭:閫氫俊濂楁帴瀛?br>                  char    szClientIP[16];// 鑷畾涔夊瓧孌?瀹㈡埛绔湴鍧
                  int nOperateType;   // 鑷畾涔夊瓧孌?鎿嶄綔綾誨瀷
          }PER_HANDLE_DATA,   FAR*  LPPER_HANDLE_DATA;
         鍦ㄤ笂闈㈢殑緇撴瀯涓繕鍙互鍔犲叆鑷繁闇瑕佺殑瀛楁銆傚湪鎴戜笅闈㈢殑渚嬪瓙紼嬪簭涓紝szClientIP鏄敤鏉ヤ繚瀛樿繛鎺ヤ笂鏉ョ殑瀹㈡埛绔殑IP鐨勶紝榪欐牱鍦ㄤ富綰跨▼灝嗚繖涓粨鏋勪綋浼犵粰瀛愮嚎紼嬪悗錛屽湪瀛愮嚎紼嬩腑鏍規嵁瀹㈡埛绔疘P灝辯煡閬撶洰鍓嶅鐞嗙殑鏄摢涓鎴風浜嗐備笅闈㈡槸紼嬪簭鐨勫ぇ閮ㄥ垎錛屽悓鏍烽櫎鍘諱竴浜涚畝鍗曠殑鍑洪敊杈撳嚭銆?br>#define     LISTEN_PORT 5000
#define     DATA_BUFSIZE 8192
#define     POST_RECV 0X01   
#define     POST_SEND 0X02

int   main(  )
{
           LPPER_HANDLE_DATA    lpPerHandleData;
           SOCKET               hListenSocket;
           SOCKET               hClientSocket;
           SOCKADDR_IN          ClientAddr;
           int                  nAddrLen;
           HANDLE               hThread; 

          // Start WinSock and create a listen socket.

          listen(hListenSocket,  5); 
          for (; ;)
         {
                  nAddrLen  =  sizeof(SOCKADDR);
                  hClientSocket  =  accept(hListenSocket,  (LPSOCKADDR)&ClientAddr,  &nAddrLen);

                  lpPerHandleData = (LPPER_HANDLE_DATA)malloc(sizeof(PER_HANDLE_DATA));
                  lpPerHandleData->hSocket  =  hClientSocket;
                  // 娉ㄦ剰榪欓噷灝嗚繛鎺ョ殑瀹㈡埛绔殑IP鍦板潃錛屼繚瀛樺埌浜唋pPerHandleData瀛楁涓簡
                 strcpy(lpPerHandleData->szClientIP,   inet_ntoa(ClientAddr.sin_addr));

                 // 涓烘湰嬈″鎴瘋姹備駭鐢熷瓙綰跨▼
                 hThread = CreateThread(
                           NULL,
                           0,
                           OverlappedThread,
                           lpPerHandleData,   // 灝唋pPerHandleData浼犵粰瀛愮嚎紼?br>                           0,
                           NULL
                  );
                 CloseHandle(hThread);
         }   
 return 0;
}

DWORD   WINAPI   OverlappedThread(LPVOID    lpParam)
{
            LPPER_HANDLE_DATA     lpPerHandleData   =   (LPPER_HANDLE_DATA)lpParam;
            WSAOVERLAPPED Overlapped;
            WSABUF        wsaBuf;
            char          Buffer[DATA_BUFSIZE];
            BOOL          bResult;
            int           nResult;
   
            ZeroMemory(&Overlapped, sizeof(WSAOVERLAPPED));
            wsaBuf.buf = Buffer;
            wsaBuf.len = sizeof(Buffer);
            lpPerHandleData->nOperateType = POST_RECV;     // 璁板綍鏈鎿嶄綔鏄疪ecv(..)

            dwFlags = 0;
            nResult = WSARecv(
                      lpPerHandleData->hSocket,   // Receive socket
                      &wsaBuf,                                  // 鎸囧悜WSABUF緇撴瀯鐨勬寚閽?br>                      1,                                                 // WSABUF鏁扮粍鐨勪釜鏁?br>                      &dwNumOfBytesRecved,      // 瀛樻斁褰揥SARecv瀹屾垚鍚庢墍鎺ユ敹鍒扮殑瀛楄妭鏁?br>                      &dwFlags,                                 // A pointer to flags
                      &Overlapped,                           // A pointer to a WSAOVERLAPPED structure
                      NULL                                         // A pointer to the completion routine,this is NULL
           );
          if   ( nResult   ==   SOCKET_ERROR     &&   GetLastError() !=       WSA_IO_PENDING)
          {
                 printf("WSARecv(..) failed.\n");
                 free(lpPerHandleData);
                 return 1;
          }

         while (TRUE)
         {
                 bResult  =  WSAGetOverlappedResult(
                        lpPerHandleData->hSocket,  
                        &Overlapped,           
                        &dwBytesTransferred,       // 褰撲竴涓悓姝/O瀹屾垚鍚?鎺ユ敹鍒扮殑瀛楄妭鏁?br>                       TRUE,                      // 絳夊緟I/O鎿嶄綔鐨勫畬鎴?
                       &dwFlags                   
                 );
                if   (bResult  ==  FALSE  &&  WSAGetLastError()  !=  WSA_IO_INCOMPLETE)
               {
                         printf("WSAGetOverlappdResult(..) failed.\n");
                         free(lpPerHandleData);
                         return 1;   // 閿欒閫鍑?br>                }
        
                if  (dwBytesTransferred == 0)
                {
                           printf("瀹㈡埛绔凡閫鍑?灝嗘柇寮涓庝箣鐨勮繛鎺?\n");
                           closesocket(lpPerHandleData->hSocket);
                           free(lpPerHandleData);
                           break;
                }

                 // 鍦ㄨ繖閲屽皢鎺ユ敹鍒扮殑鏁版嵁榪涜澶勭悊
               printf("Received from IP: %s.\ndata: %s\n", lpPerHandleData->szClientIP, wsaBuf.buf);    

               // 鍙戦佸彟澶栦竴涓姹傛搷浣?br>               ZeroMemory(&Overlapped, sizeof(WSAOVERLAPPED));
               lpPerHandleData->nOperateType = POST_RECV;

               dwFlags = 0;
                nResult = WSARecv(...);
                if (...)
{}

         }

         return 0;
}
         紼嬪簭緇撴瀯姣旇緝娓呮櫚錛宭pPerHandleData鏄富綰跨▼涓庡瓙綰跨▼鑱旂郴鐨勭航甯︼紝瀛愮嚎紼嬫槸閫氳繃榪欎釜緇撴瀯鑾峰緱鎵澶勭悊瀹㈡埛绔殑鎯呭喌鐨勩傚湪涓嶅悓鐨勫簲鐢ㄤ腑鍙互灝嗚繖涓粨鏋勫畾涔夋垚涓嶅悓鐨勫艦寮忥紝浠ョ鍚堟墍瀹炵幇搴旂敤鐨勯渶瑕併傛敞鎰忕粨鏋勪綋鐨刵OperateType鍦℅etOverlappedResult榪斿洖鏃剁敤鍒?鍙互鏍規嵁榪欎釜瀛楁紜畾鎴戜滑涓嬩竴姝ョ殑鎿嶄綔銆傝鏈嬪弸浠鎻愭剰瑙佷簡銆?/font>



jay 2007-04-10 18:06 鍙戣〃璇勮
]]>
Winsock 瀹屾垚绔彛妯″瀷綆浠?/title><link>http://m.shnenglu.com/yishanhante/articles/19544.html</link><dc:creator>jay</dc:creator><author>jay</author><pubDate>Sat, 10 Mar 2007 09:51:00 GMT</pubDate><guid>http://m.shnenglu.com/yishanhante/articles/19544.html</guid><wfw:comment>http://m.shnenglu.com/yishanhante/comments/19544.html</wfw:comment><comments>http://m.shnenglu.com/yishanhante/articles/19544.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/yishanhante/comments/commentRss/19544.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/yishanhante/services/trackbacks/19544.html</trackback:ping><description><![CDATA[ <p>鎽樿嚜銆奛etworking Programming for Microsoft Windows銆嬬鍏珷</p> <p>鈥滃畬鎴愮鍙b濇ā鍨嬫槸榪勪粖涓烘鏈涓哄鏉傜殑涓縐岻/O妯″瀷銆傜劧鑰岋紝鍋囪嫢涓涓簲鐢ㄧ▼搴忓悓鏃墮渶瑕佺鐞嗕負鏁頒紬澶氱殑濂楁帴瀛楋紝閭d箞閲囩敤榪欑妯″瀷錛屽線寰鍙互杈懼埌鏈浣崇殑緋葷粺鎬ц兘錛?/p> <p>浠庢湰璐ㄤ笂璇達紝瀹屾垚绔彛妯″瀷瑕佹眰鎴戜滑鍒涘緩涓涓猈in32瀹屾垚绔彛瀵硅薄錛岄氳繃鎸囧畾鏁伴噺鐨勭嚎紼嬶紝瀵歸噸鍙營/O璇鋒眰榪涜綆$悊錛屼互渚夸負宸茬粡瀹屾垚鐨勯噸鍙營/O璇鋒眰鎻愪緵鏈嶅姟銆?/p> <p>浣跨敤榪欑妯″瀷涔嬪墠錛岄鍏堣鍒涘緩涓涓狪/O瀹屾垚绔彛瀵硅薄錛岀敤瀹冮潰鍚戜換鎰忔暟閲忕殑濂楁帴瀛楀彞鏌勶紝綆$悊澶氫釜I/O璇鋒眰銆傝鍋氬埌榪欎竴鐐癸紝闇瑕佽皟鐢–reateCompletionPort鍑芥暟銆?br />璇ュ嚱鏁板畾涔夊涓嬶細</p> <p> <br />HANDLE CreateIoCompletionPort(<br />聽聽聽 HANDLE FileHandle,<br />聽聽聽 HANDLE ExistingCompletionPort,<br />聽聽聽 ULONG_PTR CompletionKey,<br />聽聽聽 DWORD NumberOfConcurrentThreads<br />);</p> <p>鍦ㄦ垜浠繁鍏ユ帰璁ㄥ叾涓殑鍚勪釜鍙傛暟涔嬪墠錛岄鍏堣娉ㄦ剰璇ュ嚱鏁板疄闄呯敤浜庝袱涓槑鏄炬湁鍒殑鐩殑錛?br />1. 鐢ㄤ簬鍒涘緩涓涓畬鎴愮鍙e璞°?br />2. 灝嗕竴涓彞鏌勫悓瀹屾垚绔彛鍏寵仈鍒頒竴璧楓?</p> <p>鏈寮濮嬪垱寤轟竴涓畬鎴愮鍙f椂錛屽敮涓鎰熷叴瓚g殑鍙傛暟渚挎槸NumberOfConcurrentThreads錛堝茍鍙戠嚎紼嬬殑鏁伴噺錛夛紱鍓嶉潰涓変釜鍙傛暟閮戒細琚拷鐣ャ侼umberOfConcurrentThreads鍙傛暟鐨勭壒孌婁箣澶勫湪浜庯紝瀹冨畾涔変簡鍦ㄤ竴涓畬鎴愮鍙d笂錛屽悓鏃跺厑璁告墽琛岀殑綰跨▼鏁伴噺銆傜悊鎯蟲儏鍐典笅錛屾垜浠笇鏈涙瘡涓鐞嗗櫒鍚勮嚜璐熻矗涓涓嚎紼嬬殑榪愯錛屼負瀹屾垚绔彛鎻愪緵鏈嶅姟錛岄伩鍏嶈繃浜庨綣佺殑綰跨▼鈥滃満鏅濆垏鎹€傝嫢灝嗚鍙傛暟璁句負0錛岃〃鏄庣郴緇熷唴瀹夎浜嗗灝戜釜澶勭悊鍣紝渚垮厑璁稿悓鏃惰繍琛屽灝戜釜綰跨▼錛佸彲鐢ㄤ笅榪頒唬鐮佸垱寤轟竴涓狪/O瀹屾垚绔彛錛?/p> <p> <br />hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);</p> <p>璇ヨ鍙ョ殑浣滅敤鏄繑鍥炰竴涓彞鏌勶紝鍦ㄤ負瀹屾垚绔彛鍒嗛厤浜嗕竴涓鎺ュ瓧鍙ユ焺鍚庯紝鐢ㄦ潵瀵歸偅涓鍙h繘琛屾爣瀹氾紙寮曠敤錛夈?</p> <p>涓銆佸伐浣滆呯嚎紼嬩笌瀹屾垚绔彛<br />鎴愬姛鍒涘緩涓涓畬鎴愮鍙e悗錛屼究鍙紑濮嬪皢濂楁帴瀛楀彞鏌勪笌瀵硅薄鍏寵仈鍒頒竴璧楓備絾鍦ㄥ叧鑱斿鎺ュ瓧涔嬪墠錛岄鍏堝繀欏誨垱寤轟竴涓垨澶氫釜鈥滃伐浣滆呯嚎紼嬧濓紝浠ヤ究鍦↖/O璇鋒眰鎶曢掔粰瀹屾垚绔彛瀵硅薄鍚庯紝涓哄畬鎴愮鍙f彁渚涙湇鍔°傚湪榪欎釜鏃跺欙紝澶у鎴栬浼氳寰楀鎬紝鍒板簳搴斿垱寤哄灝戜釜綰跨▼錛屼互渚夸負瀹屾垚绔彛鎻愪緵鏈嶅姟鍛紵榪欏疄闄呮鏄畬鎴愮鍙fā鍨嬫樉寰楅涓衡滃鏉傗濈殑涓涓柟闈紝鍥犱負鏈嶅姟I/O璇鋒眰鎵闇鐨勬暟閲忓彇鍐充簬搴旂敤紼嬪簭鐨勬諱綋璁捐鎯呭喌銆傚湪姝よ璁頒綇鐨勪竴涓噸鐐瑰湪浜庯紝鍦ㄦ垜浠皟鐢–reateIoCompletionPort鏃舵寚瀹氱殑騫跺彂綰跨▼鏁伴噺錛屼笌鎵撶畻鍒涘緩鐨勫伐浣滆呯嚎紼嬫暟閲忕浉姣旓紝瀹冧滑浠h〃鐨勫茍闈炲悓涓浠朵簨鎯呫傛棭浜涙椂鍊欙紝鎴戜滑鏇懼緩璁ぇ瀹剁敤CreateIoCompletionPort鍑芥暟涓烘瘡涓鐞嗗櫒<br />閮芥寚瀹氫竴涓嚎紼嬶紙澶勭悊鍣ㄧ殑鏁伴噺鏈夊灝戯紝渚挎寚瀹氬灝戠嚎紼嬶級浠ラ伩鍏嶇敱浜庨綣佺殑綰跨▼鈥滃満鏅濅氦鎹㈡椿鍔紝浠庤屽獎鍝嶇郴緇熺殑鏁翠綋鎬ц兘銆侰reateIoCompletionPort鍑芥暟鐨凬umberOfConcurrentThreads鍙傛暟鏄庣‘鎸囩ず緋葷粺錛氬湪涓涓畬鎴愮鍙d笂錛屼竴嬈″彧鍏佽n涓伐浣滆呯嚎紼嬭繍琛屻傚亣濡傚湪瀹屾垚绔彛涓婂垱寤虹殑宸ヤ綔鑰呯嚎紼嬫暟閲忚秴鍑簄涓紝閭d箞鍦ㄥ悓涓鏃跺埢錛屾渶澶氬彧鍏佽n涓嚎紼嬭繍琛屻備絾瀹為檯涓婏紝鍦ㄤ竴孌佃緝鐭殑鏃墮棿鍐咃紝緋葷粺鏈夊彲鑳借秴榪囪繖涓鹼紝浣嗗緢蹇究浼氭妸瀹冨噺灝戣嚦浜嬪厛鍦–reateIoCompletionPort鍑芥暟涓瀹氱殑鍊箋傞偅涔堬紝涓轟綍瀹為檯鍒涘緩鐨勫伐浣滆呯嚎紼嬫暟閲忔湁鏃惰姣擟reateIoCompletionPort鍑芥暟璁懼畾鐨勫涓浜涘憿錛熻繖鏍峰仛鏈夊繀瑕佸悧錛熷鍏堝墠鎵榪幫紝榪欎富瑕佸彇鍐充簬<br />搴旂敤紼嬪簭鐨勬諱綋璁捐鎯呭喌銆傚亣瀹氭垜浠殑鏌愪釜宸ヤ綔鑰呯嚎紼嬭皟鐢ㄤ簡涓涓嚱鏁幫紝姣斿Sleep鎴朩aitForSingleObject錛屼絾鍗磋繘鍏ヤ簡鏆傚仠錛堥攣瀹氭垨鎸傝搗錛夌姸鎬侊紝閭d箞鍏佽鍙︿竴涓嚎紼嬩唬鏇垮畠鐨勪綅緗傛崲璦涔嬶紝鎴戜滑甯屾湜闅忔椂閮借兘鎵ц灝藉彲鑳藉鐨勭嚎紼嬶紱褰撶劧錛屾渶澶х殑綰跨▼鏁伴噺鏄簨鍏堝湪CreateIoCompletionPort璋冪敤閲岃瀹氬ソ鐨勩傝繖鏍蜂竴鏉ワ紝鍋囧浜嬪厛棰勮鍒拌嚜宸辯殑綰跨▼鏈夊彲鑳芥殏鏃跺浜庡仠欏跨姸鎬侊紝閭d箞鏈濂借兘澶熷垱寤烘瘮CreateIoCompletionPort鐨凬umberOfConcurrentThreads鍙傛暟鐨勫煎鐨勭嚎紼嬶紝浠ヤ究鍒版椂鍊欏厖鍒嗗彂鎸ョ郴緇熺殑娼滃姏銆備竴鏃﹀湪瀹屾垚绔彛涓婃嫢鏈夎凍澶熷鐨勫伐浣滆呯嚎紼嬫潵涓篒/O璇鋒眰鎻愪緵鏈嶅姟錛屼究鍙潃鎵嬪皢濂楁帴瀛楀彞鏌勫悓瀹屾垚绔彛鍏寵仈鍒頒竴璧楓傝繖瑕佹眰鎴戜滑鍦ㄤ竴涓幇鏈夌殑瀹屾垚绔彛涓婏紝璋冪敤CreateIoCompletionPort鍑芥暟錛屽悓鏃朵負鍓嶄笁涓弬鏁扳斺擣ileHandle錛孍xistingCompletionPort鍜孋ompletionKey鈥斺旀彁渚涘鎺ュ瓧鐨勪俊鎭傚叾涓紝 FileHandle鍙傛暟鎸囧畾涓涓鍚屽畬鎴愮鍙e叧鑱斿湪涓璧風殑濂楁帴瀛楀彞鏌勩侲xistingCompletionPort鍙傛暟鎸囧畾鐨勬槸涓涓幇鏈夌殑瀹屾垚绔彛銆侰ompletionKey錛堝畬鎴愰敭錛夊弬鏁板垯鎸囧畾瑕佷笌鏌愪釜鐗瑰畾濂楁帴瀛楀彞鏌勫叧鑱斿湪涓璧風殑鈥滃崟鍙ユ焺鏁版嵁鈥濓紱鍦ㄨ繖涓弬鏁頒腑錛屽簲鐢ㄧ▼搴忓彲淇濆瓨涓庝竴涓鎺ュ瓧瀵瑰簲鐨勪換鎰忕被鍨嬬殑淇℃伅銆備箣鎵浠ユ妸瀹冨彨浣溾滃崟鍙ユ焺鏁版嵁鈥濓紝鏄敱浜庡畠鍙<br />搴旂潃涓庨偅涓鎺ュ瓧鍙ユ焺鍏寵仈鍦ㄤ竴璧風殑鏁版嵁銆傚彲灝嗗叾浣滀負鎸囧悜涓涓暟鎹粨鏋勭殑鎸囬拡錛屾潵淇濆瓨濂楁帴瀛楀彞鏌勶紱鍦ㄩ偅涓粨鏋勪腑錛屽悓鏃跺寘鍚簡濂楁帴瀛楃殑鍙ユ焺錛屼互鍙婁笌閭d釜濂楁帴瀛楁湁鍏崇殑鍏朵粬淇℃伅銆?/p> <p>鏍規嵁鎴戜滑鍒扮洰鍓嶄負姝㈠鍒扮殑涓滆タ錛岄鍏堟潵鏋勫緩涓涓熀鏈殑搴旂敤紼嬪簭妗嗘灦銆備笅闈㈤槓榪頒簡濡備綍浣跨敤瀹屾垚绔彛妯″瀷錛屾潵寮鍙戜竴涓狤CHO鏈嶅姟鍣ㄥ簲鐢ㄣ傚湪榪欎釜紼嬪簭涓紝鎴戜滑鍩烘湰涓婃寜涓嬭堪姝ラ琛屼簨錛?/p> <p>1) 鍒涘緩涓涓畬鎴愮鍙c傜鍥涗釜鍙傛暟淇濇寔涓?錛屾寚瀹氬湪瀹屾垚绔彛涓婏紝姣忎釜澶勭悊鍣ㄤ竴嬈″彧鍏佽鎵ц涓涓伐浣滆呯嚎紼嬨?br />2) 鍒ゆ柇緋葷粺鍐呭埌搴曞畨瑁呬簡澶氬皯涓鐞嗗櫒銆?br />3) 鍒涘緩宸ヤ綔鑰呯嚎紼嬶紝鏍規嵁姝ラ2)寰楀埌鐨勫鐞嗗櫒淇℃伅錛屽湪瀹屾垚绔彛涓婏紝涓哄凡瀹屾垚鐨処/O璇鋒眰鎻愪緵鏈嶅姟銆?br />4) 鍑嗗濂戒竴涓洃鍚鎺ュ瓧錛屽湪绔彛5150涓婄洃鍚繘鍏ョ殑榪炴帴璇鋒眰銆?br />5) 浣跨敤accept鍑芥暟錛屾帴鍙楄繘鍏ョ殑榪炴帴璇鋒眰銆?br />6) 鍒涘緩涓涓暟鎹粨鏋勶紝鐢ㄤ簬瀹圭撼鈥滃崟鍙ユ焺鏁版嵁鈥濓紝鍚屾椂鍦ㄧ粨鏋勪腑瀛樺叆鎺ュ彈鐨勫鎺ュ瓧鍙ユ焺銆?br />7) 璋冪敤CreateIoCompletionPort錛屽皢鑷猘ccept榪斿洖鐨勬柊濂楁帴瀛楀彞鏌勫悓瀹屾垚绔彛鍏寵仈鍒頒竴璧楓傞氳繃瀹屾垚閿紙CompletionKey錛夊弬鏁幫紝灝嗗崟鍙ユ焺鏁版嵁緇撴瀯浼犻掔粰CreateIoCompletionPort銆?br />8) 寮濮嬪湪宸叉帴鍙楃殑榪炴帴涓婅繘琛孖/O鎿嶄綔銆傚湪姝わ紝鎴戜滑甯屾湜閫氳繃閲嶅彔I/O鏈哄埗錛屽湪鏂板緩鐨勫鎺ュ瓧涓婃姇閫掍竴涓垨澶氫釜寮傛WSARecv鎴朩SASend璇鋒眰銆傝繖浜汭/O璇鋒眰瀹屾垚鍚庯紝涓涓伐浣滆呯嚎紼嬩細涓篒/O璇鋒眰鎻愪緵鏈嶅姟錛屽悓鏃剁戶緇鐞嗘湭鏉ョ殑I/O璇鋒眰錛岀◢鍚庝究浼氬湪姝ラ3 )鎸囧畾鐨勫伐浣滆呬緥紼嬩腑錛屼綋楠屽埌榪欎竴鐐廣?br />9) 閲嶅姝ラ5 ) ~ 8 )錛岀洿鑷蟲湇鍔″櫒涓銆?/p> <p>浜屻佸畬鎴愮鍙e拰閲嶅彔I/O<br />灝嗗鎺ュ瓧鍙ユ焺涓庝竴涓畬鎴愮鍙e叧鑱斿湪涓璧峰悗錛屼究鍙互濂楁帴瀛楀彞鏌勪負鍩虹錛屾姇閫掑彂閫佷笌鎺ユ敹璇鋒眰錛屽紑濮嬪I/O璇鋒眰鐨勫鐞嗐傛帴涓嬫潵錛屽彲寮濮嬩緷璧栧畬鎴愮鍙o紝鏉ユ帴鏀舵湁鍏矷/O鎿嶄綔瀹屾垚鎯呭喌鐨勯氱煡銆備粠鏈川涓婅錛屽畬鎴愮鍙fā鍨嬪埄鐢ㄤ簡Win32閲嶅彔I/O鏈哄埗銆傚湪榪欑鏈哄埗涓紝璞SASend鍜學SARecv榪欐牱鐨刉insock API璋冪敤浼氱珛鍗寵繑鍥炪傛鏃訛紝闇瑕佺敱鎴戜滑鐨勫簲鐢ㄧ▼搴忚礋璐e湪浠ュ悗鐨勬煇涓椂闂達紝閫氳繃涓涓狾VERLAPPED緇撴瀯錛屾潵鎺ユ敹璋冪敤鐨勭粨鏋溿傚湪瀹屾垚绔彛妯″瀷涓紝瑕佹兂鍋氬埌榪欎竴鐐癸紝闇瑕佷嬌鐢℅etQueuedCompletionStatus錛堣幏鍙栨帓闃熷畬鎴愮姸鎬侊級鍑芥暟錛岃涓涓垨澶氫釜宸ヤ綔鑰呯嚎紼嬪湪瀹屾垚绔彛涓婄瓑寰呫傝鍑芥暟鐨勫畾涔夊涓嬶細</p> <p> <br />BOOL GetQueuedCompletionStatus(<br />聽聽聽 HANDLE CompletionPort,<br />聽聽聽 LPDWORD lpNumberOfBytes,<br />聽聽聽 PULONG_PTR lpCompletionKey,<br />聽聽聽 LPOVERLAPPED* lpOverlapped,<br />聽聽聽 DWORD dwMilliseconds<br />);</p> <p>鍏朵腑錛孋ompletionPort鍙傛暟瀵瑰簲浜庤鍦ㄤ笂闈㈢瓑寰呯殑瀹屾垚绔彛銆俵pNumberOfBytes鍙傛暟璐熻矗鍦ㄥ畬鎴愪簡涓嬈/O鎿嶄綔鍚庯紙濡俉SASend鎴朩SARecv錛夛紝鎺ユ敹瀹為檯浼犺緭鐨勫瓧鑺傛暟銆俵pCompletionKey鍙傛暟涓哄師鍏堜紶閫掕繘鍏reateIoCompletionPort鍑芥暟鐨勫鎺ュ瓧榪斿洖鈥滃崟鍙ユ焺鏁版嵁鈥濄傚鎴戜滑鏃╁厛鎵榪幫紝澶у鏈濂藉皢濂楁帴瀛楀彞鏌勪繚瀛樺湪榪欎釜鈥滈敭鈥濓紙Key錛変腑銆俵pOverlapped鍙傛暟鐢ㄤ簬鎺ユ敹瀹屾垚鐨処/O鎿嶄綔鐨勯噸鍙犵粨鏋溿傝繖瀹為檯鏄竴涓浉褰撻噸瑕佺殑鍙傛暟錛屽洜涓哄彲鐢ㄥ畠鑾峰彇姣忎釜I/O鎿嶄綔鐨勬暟鎹傝屾渶鍚庝竴涓弬鏁幫紝dwMilliseconds錛岀敤浜庢寚瀹氳皟鐢ㄨ呭笇鏈涚瓑寰呬竴涓畬鎴愭暟鎹寘鍦ㄥ畬鎴愮鍙d笂鍑虹幇鐨勬椂闂淬傚亣濡傚皢鍏惰涓篒NFINITE錛岃皟鐢ㄤ細鏃犱紤姝㈠湴絳夊緟涓嬪幓銆?</p> <p>涓夈佸崟鍙ユ焺鏁版嵁鍜屽崟I/O鎿嶄綔鏁版嵁<br />涓涓伐浣滆呯嚎紼嬩粠GetQueuedCompletionStatus榪欎釜API璋冪敤鎺ユ敹鍒癐/O瀹屾垚閫氱煡鍚庯紝鍦╨pCompletionKey鍜宭pOverlapped鍙傛暟涓紝浼氬寘鍚竴浜涘繀瑕佺殑濂楁帴瀛椾俊鎭傚埄鐢ㄨ繖浜涗俊鎭紝鍙氳繃瀹屾垚绔彛錛岀戶緇湪涓涓鎺ュ瓧涓婄殑I/O澶勭悊銆傞氳繃榪欎簺鍙傛暟錛屽彲鑾峰緱涓ゆ柟闈㈤噸瑕佺殑濂楁帴瀛楁暟鎹細鍗曞彞鏌勬暟鎹紝浠ュ強鍗旾/O鎿嶄綔鏁版嵁銆傚叾涓紝lpCompletionKey鍙傛暟鍖呭惈浜嗏滃崟鍙ユ焺鏁版嵁鈥濓紝鍥犱負鍦ㄤ竴涓鎺ュ瓧棣栨涓庡畬鎴愮鍙e叧鑱斿埌涓璧風殑鏃跺欙紝閭d簺鏁版嵁渚夸笌涓涓壒瀹氱殑濂楁帴瀛楀彞鏌勫搴旇搗鏉ヤ簡銆傝繖浜涙暟鎹鏄垜浠湪榪涜CreateIoCompletionPort API璋冪敤鐨勬椂鍊欙紝閫氳繃CompletionKey鍙傛暟浼犻掔殑銆傚鏃╁厛鎵榪幫紝搴旂敤紼嬪簭鍙氳繃璇ュ弬鏁頒紶閫掍換鎰忕被鍨嬬殑鏁版嵁銆傞氬父鎯呭喌涓嬶紝搴旂敤紼嬪簭浼氬皢涓嶪/O璇鋒眰鏈夊叧鐨勫鎺ュ瓧鍙ユ焺淇濆瓨鍦ㄨ繖閲屻俵pOverlapped鍙傛暟鍒欏寘鍚簡涓涓狾VERLAPPED緇撴瀯錛屽湪瀹冨悗闈㈣窡闅忊滃崟I/O鎿嶄綔鏁版嵁鈥濄傛垜浠殑宸ヤ綔鑰呯嚎紼嬪鐞嗕竴涓畬鎴愭暟鎹寘鏃訛紙灝嗘暟鎹師灝佷笉鍔ㄦ墦杞洖鍘伙紝鎺ュ彈榪炴帴錛屾姇閫掑彟涓涓嚎紼嬶紝絳夌瓑錛夛紝榪欎簺淇℃伅鏄畠蹇呴』瑕佺煡閬撶殑銆傚崟I/O鎿嶄綔鏁版嵁鍙互鏄拷鍔犲埌涓涓狾VERLAPPED緇撴瀯鏈熬鐨勩佷換鎰忔暟閲忕殑瀛楄妭銆傚亣濡備竴涓嚱鏁拌姹傜敤鍒頒竴涓狾VERLAPPED緇撴瀯錛屾垜浠究蹇呴』灝嗚繖鏍風殑涓涓粨鏋勪紶閫掕繘鍘伙紝浠ユ弧瓚沖畠鐨勮姹傘傝鎯沖仛鍒拌繖涓鐐癸紝涓涓畝鍗曠殑鏂規硶鏄畾涔変竴涓粨鏋勶紝鐒跺悗灝哋VERLAPPED緇撴瀯浣滀負鏂扮粨鏋勭殑絎竴涓厓绱犱嬌鐢ㄣ備婦涓緥瀛愭潵璇達紝鍙畾涔変笅榪版暟鎹粨鏋勶紝瀹炵幇瀵瑰崟I/O鎿嶄綔鏁版嵁鐨勭鐞嗭細</p> <p> <br />typedef struct<br />{<br />聽聽聽 OVERLAPPED Overlapped;<br />聽聽聽 WSABUF聽聽聽聽 DataBuf;<br />聽聽聽 CHAR聽聽聽聽聽聽 Buffer[DATA_BUFSIZE];<br />聽聽聽 BOOL聽聽聽聽聽聽 OperationType;<br />}PER_IO_OPERATION_DATA</p> <p>璇ョ粨鏋勬紨紺轟簡閫氬父瑕佷笌I/O鎿嶄綔鍏寵仈鍦ㄤ竴璧風殑鏌愪簺閲嶈鏁版嵁鍏冪礌錛屾瘮濡傚垰鎵嶅畬鎴愮殑閭d釜I/O鎿嶄綔鐨勭被鍨嬶紙鍙戦佹垨鎺ユ敹璇鋒眰錛夈傚湪榪欎釜緇撴瀯涓紝鎴戜滑璁や負鐢ㄤ簬宸插畬鎴怚/O鎿嶄綔鐨勬暟鎹紦鍐插尯鏄潪甯告湁鐢ㄧ殑銆傝鎯寵皟鐢ㄤ竴涓猈insock API鍑芥暟錛屽悓鏃朵負鍏跺垎閰嶄竴涓狾VERLAPPED緇撴瀯錛屾棦鍙皢鑷繁鐨勭粨鏋勨滈犲瀷鈥濅負涓涓狾VERLAPPED鎸囬拡錛屼害鍙畝鍗曞湴鎾ゆ秷瀵圭粨鏋勪腑鐨凮VERLAPPED鍏冪礌鐨勫紩鐢ㄣ傚涓嬩緥鎵紺猴細</p> <p>PER_IO_OPERATION_DATA PerIoData;<br />// 鍙儚涓嬮潰榪欐牱璋冪敤涓涓嚱鏁?br />聽 WSARecv(socket, ..., (OVERLAPPED *)&PerIoData);<br />// 鎴栧儚榪欐牱<br />聽 WSARecv(socket, ..., &(PerIoData.Overlapped));</p> <p>鍦ㄥ伐浣滅嚎紼嬬殑鍚庨潰閮ㄥ垎錛岀瓑GetQueuedCompletionStatus鍑芥暟榪斿洖浜嗕竴涓噸鍙犵粨鏋勶紙鍜屽畬鎴愰敭錛夊悗錛屼究鍙氳繃鎾ゆ秷瀵筄perationType鎴愬憳鐨勫紩鐢紝璋冩煡鍒板簳鏄摢涓搷浣滄姇閫掑埌浜嗚繖涓彞鏌勪箣涓婏紙鍙渶灝嗚繑鍥炵殑閲嶅彔緇撴瀯閫犲瀷涓鴻嚜宸辯殑PER_IO_OPERATION_DATA緇撴瀯錛夈傚鍗旾/O鎿嶄綔鏁版嵁鏉ヨ錛屽畠鏈澶х殑涓涓紭鐐逛究鏄厑璁告垜浠湪鍚屼竴涓彞鏌勪笂錛屽悓鏃剁鐞嗗涓狪/O鎿嶄綔錛堣/鍐欙紝澶氫釜璇伙紝澶氫釜鍐欙紝絳夌瓑錛夈傚ぇ瀹舵鏃舵垨璁鎬細浜х敓榪欐牱鐨勭枒闂細鍦ㄥ悓涓涓鎺ュ瓧涓婏紝鐪熺殑鏈夊繀瑕佸悓鏃舵姇閫掑涓狪/O鎿嶄綔鍚楋紵絳旀鍦ㄤ簬緋葷粺鐨勨滀幾緙╂р濓紝鎴栬呰鈥滄墿灞曡兘鍔涒濄備緥濡傦紝鍋囧畾鎴戜滑鐨勬満鍣ㄥ畨瑁呬簡澶氫釜涓ぎ澶勭悊鍣紝姣忎釜澶勭悊鍣ㄩ兘鍦ㄨ繍琛屼竴涓伐浣滆呯嚎紼嬶紝閭d箞鍦ㄥ悓涓涓椂<br />鍊欙紝瀹屽叏鍙兘鏈夊嚑涓笉鍚岀殑澶勭悊鍣ㄥ湪鍚屼竴涓鎺ュ瓧涓婏紝榪涜鏁版嵁鐨勬敹鍙戞搷浣溿?</p> <p>鏈鍚庤娉ㄦ剰鐨勪竴澶勭粏鑺傛槸濡備綍姝g‘鍦板叧闂璉/O瀹屾垚绔彛鈥旂壒鍒槸鍚屾椂榪愯浜嗕竴涓垨澶氫釜綰跨▼錛屽湪鍑犱釜涓嶅悓鐨勫鎺ュ瓧涓婃墽琛孖/O鎿嶄綔鐨勬椂鍊欍傝閬垮厤鐨勪竴涓噸瑕侀棶棰樻槸鍦ㄨ繘琛岄噸鍙營/O鎿嶄綔鐨勫悓鏃訛紝寮鴻閲婃斁涓涓狾VERLAPPED緇撴瀯銆傝鎯抽伩鍏嶅嚭鐜拌繖縐嶆儏鍐碉紝鏈濂界殑鍔炴硶鏄拡瀵規瘡涓鎺ュ瓧鍙ユ焺錛岃皟鐢╟losesocket鍑芥暟錛屼換浣曞皻鏈繘琛岀殑閲嶅彔I/O鎿嶄綔閮戒細瀹屾垚銆備竴鏃︽墍鏈夊鎺ュ瓧鍙ユ焺閮藉凡鍏抽棴錛屼究闇鍦ㄥ畬鎴愮鍙d笂錛岀粓姝㈡墍鏈夊伐浣滆呯嚎紼嬬殑榪愯銆傝鎯沖仛鍒拌繖涓鐐癸紝 闇瑕佷嬌鐢≒ostQueuedCompletionStatus鍑芥暟錛屽悜姣忎釜宸ヤ綔鑰呯嚎紼嬮兘鍙戦佷竴涓壒孌婄殑瀹屾垚鏁版嵁鍖呫傝鍑芥暟浼氭寚紺烘瘡涓嚎紼嬮兘鈥滅珛鍗崇粨鏉熷茍閫鍑衡濄備笅闈㈡槸PostQueuedCompletionStatus鍑芥暟鐨勫畾涔夛細</p> <p> <br />BOOL PostQueuedCompletionStatus(<br />聽聽聽 HANDLE CompletionPort,<br />聽聽聽 DWORD dwNumberOfBytesTransferred,<br />聽聽聽 ULONG_PTR dwCompletionKey,<br />聽聽聽 LPOVERLAPPED lpOverlapped<br />);</p> <p>鍏朵腑錛孋ompletionPort鍙傛暟鎸囧畾鎯沖悜鍏跺彂閫佷竴涓畬鎴愭暟鎹寘鐨勫畬鎴愮鍙e璞°傝屽氨dwNumberOfBytesTransferred銆乨wCompletionKey鍜宭pOverlapped榪欎笁涓弬鏁版潵璇達紝姣忎竴涓兘鍏佽鎴戜滑鎸囧畾涓涓鹼紝鐩存帴浼犻掔粰GetQueuedCompletionStatus鍑芥暟涓搴旂殑鍙傛暟銆傝繖鏍蜂竴鏉ワ紝涓涓伐浣滆呯嚎紼嬫敹鍒頒紶閫掕繃鏉ョ殑涓変釜GetQueuedCompletionStatus鍑芥暟鍙傛暟鍚庯紝渚垮彲鏍規嵁鐢辮繖涓変釜鍙傛暟鐨勬煇涓涓緗殑鐗規畩鍊鹼紝鍐沖畾浣曟椂搴旇閫鍑恒備緥濡傦紝鍙敤dwCompletionPort鍙傛暟浼犻?鍊鹼紝鑰屼竴涓伐浣滆呯嚎紼嬩細灝嗗叾瑙i噴鎴愪腑姝㈡寚浠ゃ備竴鏃︽墍鏈夊伐浣滆呯嚎紼嬮兘宸插叧闂紝渚垮彲浣跨敤CloseHandle鍑芥暟錛屽叧闂畬鎴愮鍙o紝鏈緇堝畨鍏ㄩ鍑虹▼搴忋?/p> <p>娉細CreateIoCompletionPort 錛孭ostQueuedCompletionStatus 錛孏etQueuedCompletionStatus 絳夊嚱鏁扮殑鐢ㄦ硶璇存槑銆?/p> <p>Platform SDK: Storage </p> <p>聽</p> <p>聽</p> <p>I/O Completion Ports</p> <p>I/O completion ports are the mechanism by which an application uses a pool of threads that was created when the application was started to process asynchronous I/O requests. These threads are created for the sole purpose of processing I/O requests. Applications that process many concurrent asynchronous I/O requests can do so more quickly and efficiently by using I/O completion ports than by using creating threads at the time of the I/O request. </p> <p>聽</p> <p>聽</p> <p>聽 </p> <p>聽</p> <p>聽</p> <p>I/O瀹屾垚绔彛(s)鏄竴縐嶆満鍒訛紝閫氳繃榪欎釜鏈哄埗錛屽簲鐢ㄧ▼搴忓湪鍚姩鏃朵細棣栧厛鍒涘緩涓涓嚎紼嬫睜錛岀劧鍚庤搴旂敤紼嬪簭浣跨敤綰跨▼姹犲鐞嗗紓姝/O璇鋒眰銆傝繖浜涚嚎紼嬭鍒涘緩鐨勫敮涓鐩殑灝辨槸鐢ㄤ簬澶勭悊I/O璇鋒眰銆傚浜庡鐞嗗ぇ閲忓茍鍙戝紓姝/O璇鋒眰鐨勫簲鐢ㄧ▼搴忔潵璇達紝鐩告瘮浜庡湪I/O璇鋒眰鍙戠敓鏃跺垱寤虹嚎紼嬫潵璇達紝浣跨敤瀹屾垚绔彛(s)瀹冨氨鍙互鍋氱殑鏇村揩涓旀洿鏈夋晥鐜囥?</p> <p>聽</p> <p>聽</p> <p>聽 </p> <p>聽</p> <p>聽</p> <p>The CreateIoCompletionPort function associates an I/O completion port with one or more file handles. When an asynchronous I/O operation started on a file handle associated with a completion port is completed, an I/O completion packet is queued to the port. This can be used to combine the synchronization point for multiple file handles into a single object. </p> <p>聽</p> <p>聽</p> <p>聽 </p> <p>聽</p> <p>聽</p> <p>CreateIoCompletionPort鍑芥暟浼氫嬌涓涓狪/O瀹屾垚绔彛涓庝竴涓垨澶氫釜鏂囦歡鍙ユ焺鍙戠敓鍏寵仈銆傚綋涓庝竴涓畬鎴愮鍙g浉鍏崇殑鏂囦歡鍙ユ焺涓婂惎鍔ㄧ殑寮傛I/O鎿嶄綔瀹屾垚鏃訛紝涓涓狪/O瀹屾垚鍖呭氨浼氳繘鍏ュ埌璇ュ畬鎴愮鍙g殑闃熷垪涓傚浜庡涓枃浠跺彞鏌勬潵璇達紝灝卞彲浠ユ妸榪欎簺澶氫釜鏂囦歡鍙ユ焺鍚堝茍鎴愪竴涓崟鐙殑瀵硅薄錛岃繖涓彲浠ヨ鐢ㄦ潵緇撳悎鍚屾鐐癸紵 </p> <p>聽</p> <p>聽</p> <p>聽 </p> <p>聽</p> <p>聽</p> <p>A thread uses the GetQueuedCompletionStatus function to wait for a completion packet to be queued to the completion port, rather than waiting directly for the asynchronous I/O to complete. Threads that block their execution on a completion port are released in last-in-first-out (LIFO) order. This means that when a completion packet is queued to the completion port, the system releases the last thread to block its execution on the port. </p> <p>聽</p> <p>聽</p> <p>璋冪敤GetQueuedCompletionStatus鍑芥暟錛屾煇涓嚎紼嬪氨浼氱瓑寰呬竴涓畬鎴愬寘榪涘叆鍒板畬鎴愮鍙g殑闃熷垪涓紝鑰屼笉鏄洿鎺ョ瓑寰呭紓姝/O璇鋒眰瀹屾垚銆傜嚎紼嬶紙浠級灝變細闃誨浜庡畠浠殑榪愯鍦ㄥ畬鎴愮鍙o紙鎸夌収鍚庤繘鍏堝嚭闃熷垪欏哄簭鐨勮閲婃斁錛夈傝繖灝辨剰鍛崇潃褰撲竴涓畬鎴愬寘榪涘叆鍒板畬鎴愮鍙g殑闃熷垪涓椂錛岀郴緇熶細閲婃斁鏈榪戣闃誨鍦ㄨ瀹屾垚绔彛鐨勭嚎紼嬨?</p> <p>聽</p> <p>聽</p> <p>聽 </p> <p>聽</p> <p>聽</p> <p>When a thread calls GetQueuedCompletionStatus, it is associated with the specified completion port until it exits, specifies a different completion port, or frees the completion port. A thread can be associated with at most one completion port. </p> <p>聽</p> <p>聽</p> <p>璋冪敤GetQueuedCompletionStatus錛岀嚎紼嬪氨浼氬皢浼氫笌鏌愪釜鎸囧畾鐨勫畬鎴愮鍙e緩绔嬭仈緋伙紝涓鐩村歡緇叾璇ョ嚎紼嬬殑瀛樺湪鍛ㄦ湡錛屾垨琚寚瀹氫簡涓嶅悓鐨勫畬鎴愮鍙o紝鎴栬呴噴鏀句簡涓庡畬鎴愮鍙g殑鑱旂郴銆備竴涓嚎紼嬪彧鑳戒笌鏈澶氫笉瓚呰繃涓涓殑瀹屾垚绔彛鍙戠敓鑱旂郴銆?</p> <p>聽</p> <p>聽</p> <p>聽 </p> <p>聽</p> <p>聽</p> <p>The most important property of a completion port is the concurrency value. The concurrency value of a completion port is specified when the completion port is created. This value limits the number of runnable threads associated with the completion port. When the total number of runnable threads associated with the completion port reaches the concurrency value, the system blocks the execution of any subsequent threads that specify the completion port until the number of runnable threads associated with the completion port drops below the concurrency value. The most efficient scenario occurs when there are completion packets waiting in the queue, but no waits can be satisfied because the port has reached its concurrency limit. In this case, when a running thread calls GetQueuedCompletionStatus, it will immediately pick up the queued completion packet. No context switches will occur, because the running thread is continually picking up completion packets and the other threads are unable to run. </p> <p>聽</p> <p>聽</p> <p>瀹屾垚绔彛鏈閲嶈鐨勭壒鎬у氨鏄茍鍙戦噺銆傚畬鎴愮鍙g殑騫跺彂閲忓彲浠ュ湪鍒涘緩璇ュ畬鎴愮鍙f椂鎸囧畾銆傝騫跺彂閲忛檺鍒朵簡涓庤瀹屾垚绔彛鐩稿叧鑱旂殑鍙繍琛岀嚎紼嬬殑鏁扮洰銆傚綋涓庤瀹屾垚绔彛鐩稿叧鑱旂殑鍙繍琛岀嚎紼嬬殑鎬繪暟鐩揪鍒頒簡璇ュ茍鍙戦噺錛岀郴緇熷氨浼氶樆濉炰換浣曚笌璇ュ畬鎴愮鍙g浉鍏寵仈鐨勫悗緇嚎紼嬬殑鎵ц錛岀洿鍒頒笌璇ュ畬鎴愮鍙g浉鍏寵仈鐨勫彲榪愯綰跨▼鏁扮洰涓嬮檷鍒板皬浜庤騫跺彂閲忎負姝€傛渶鏈夋晥鐨勫亣鎯蟲槸鍙戠敓鍦ㄦ湁瀹屾垚鍖呭湪闃熷垪涓瓑寰咃紝鑰屾病鏈夌瓑寰呰婊¤凍錛屽洜涓烘鏃跺畬鎴愮鍙h揪鍒頒簡鍏跺茍鍙戦噺鐨勬瀬闄愩傛鏃訛紝涓涓鍦ㄨ繍琛屼腑鐨勭嚎紼嬭皟鐢℅etQueuedCompletionStatus鏃訛紝瀹冨氨浼氱珛鍒諱粠闃熷垪涓彇璧拌瀹屾垚鍖呫傝繖鏍峰氨涓嶅瓨鍦ㄧ潃鐜鐨勫垏鎹紝鍥犱負璇ュ浜庤繍琛屼腑鐨勭嚎紼嬪氨浼氳繛緇笉鏂湴浠庨槦鍒椾腑鍙栬蛋瀹屾垚鍖咃紝鑰屽叾浠栫殑綰跨▼灝變笉鑳借繍琛屼簡銆?</p> <p>聽</p> <p>聽</p> <p>聽 </p> <p>聽</p> <p>聽</p> <p>The best value to pick for the concurrency value is the number of CPUs on the machine. If your transaction required a lengthy computation, a larger concurrency value will allow more threads to run. Each transaction will take longer to complete, but more transactions will be processed at the same time. It is easy to experiment with the concurrency value to achieve the best effect for your application. </p> <p>聽</p> <p>聽</p> <p>瀵逛簬騫跺彂閲忔渶濂界殑鎸戦夊煎氨鏄偍璁$畻鏈轟腑cpu鐨勬暟鐩傚鏋滄偍鐨勪簨鍔″鐞嗛渶瑕佷竴涓極闀跨殑璁$畻鏃墮棿錛屼竴涓瘮杈冨ぇ鐨勫茍鍙戦噺鍙互鍏佽鏇村綰跨▼鏉ヨ繍琛屻傝櫧鐒跺畬鎴愭瘡涓簨鍔″鐞嗛渶瑕佽姳璐規洿闀跨殑鏃墮棿錛屼絾鏇村鐨勪簨鍔″彲浠ュ悓鏃惰澶勭悊銆傚浜庡簲鐢ㄧ▼搴忔潵璇達紝寰堝鏄撻氳繃嫻嬭瘯騫跺彂閲忔潵鑾峰緱鏈濂界殑鏁堟灉銆?</p> <p>聽</p> <p>聽</p> <p>聽 </p> <p>聽</p> <p>聽</p> <p>The PostQueuedCompletionStatus function allows an application to queue its own special-purpose I/O completion packets to the completion port without starting an asynchronous I/O operation. This is useful for notifying worker threads of external events. </p> <p>聽</p> <p>聽</p> <p>PostQueuedCompletionStatus鍑芥暟鍏佽搴旂敤紼嬪簭鍙互閽堝鑷畾涔夌殑涓撶敤I/O瀹屾垚鍖呰繘琛屾帓闃燂紝鑰屾棤闇鍚姩涓涓紓姝/O鎿嶄綔銆傝繖鐐瑰浜庨氱煡澶栭儴浜嬩歡鐨勫伐浣滆呯嚎紼嬫潵璇村緢鏈夌敤銆?</p> <p>聽</p> <p>聽</p> <p>聽 </p> <p>聽</p> <p>聽</p> <p>The completion port is freed when there are no more references to it. The completion port handle and every file handle associated with the completion port reference the completion port. All the handles must be closed to free the completion port. To close the port handle, call the CloseHandle function. </p> <p>聽</p> <p>聽</p> <p>鍦ㄦ病鏈夋洿澶氱殑寮曠敤閽堝鏌愪釜瀹屾垚绔彛鏃訛紝闇瑕侀噴鏀捐瀹屾垚绔彛銆傝瀹屾垚绔彛鍙ユ焺浠ュ強涓庤瀹屾垚绔彛鐩稿叧鑱旂殑鎵鏈夋枃浠跺彞鏌勯兘闇瑕佽閲婃斁銆傝皟鐢–loseHandle鍙互閲婃斁瀹屾垚绔彛鐨勫彞鏌勩?<br /></p> <img src ="http://m.shnenglu.com/yishanhante/aggbug/19544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/yishanhante/" target="_blank">jay</a> 2007-03-10 17:51 <a href="http://m.shnenglu.com/yishanhante/articles/19544.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item></channel></rss> <a href="http://m.shnenglu.com/">青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品</a> <div style="position:fixed;left:-9000px;top:-9000px;"><font id="pjuwb"></font><button id="pjuwb"><pre id="pjuwb"></pre></button><sub id="pjuwb"></sub><tbody id="pjuwb"><var id="pjuwb"><address id="pjuwb"></address></var></tbody><listing id="pjuwb"><label id="pjuwb"><strong id="pjuwb"></strong></label></listing><wbr id="pjuwb"><small id="pjuwb"><tbody id="pjuwb"></tbody></small></wbr><ins id="pjuwb"><xmp id="pjuwb"></xmp></ins><style id="pjuwb"></style><label id="pjuwb"><em id="pjuwb"><li id="pjuwb"></li></em></label><samp id="pjuwb"></samp><menu id="pjuwb"><input id="pjuwb"></input></menu><pre id="pjuwb"><tbody id="pjuwb"><tfoot id="pjuwb"><button id="pjuwb"></button></tfoot></tbody></pre><form id="pjuwb"></form><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"><sup id="pjuwb"></sup></label></style></i><li id="pjuwb"><table id="pjuwb"><abbr id="pjuwb"></abbr></table></li><video id="pjuwb"></video><dfn id="pjuwb"></dfn><progress id="pjuwb"></progress><strong id="pjuwb"></strong><mark id="pjuwb"></mark><em id="pjuwb"></em><tbody id="pjuwb"><p id="pjuwb"><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike></p></tbody><option id="pjuwb"></option><strike id="pjuwb"></strike><u id="pjuwb"></u><td id="pjuwb"><center id="pjuwb"><tr id="pjuwb"></tr></center></td><em id="pjuwb"><mark id="pjuwb"><em id="pjuwb"><tt id="pjuwb"></tt></em></mark></em><strong id="pjuwb"></strong><wbr id="pjuwb"></wbr><s id="pjuwb"></s><strong id="pjuwb"></strong><legend id="pjuwb"></legend><nav id="pjuwb"></nav><dl id="pjuwb"><th id="pjuwb"><dl id="pjuwb"></dl></th></dl><noframes id="pjuwb"><ins id="pjuwb"></ins></noframes><font id="pjuwb"></font><strike id="pjuwb"><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"></label></style></i></strike><output id="pjuwb"></output><thead id="pjuwb"><pre id="pjuwb"></pre></thead><source id="pjuwb"></source><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem><pre id="pjuwb"><span id="pjuwb"><pre id="pjuwb"><big id="pjuwb"></big></pre></span></pre><cite id="pjuwb"><fieldset id="pjuwb"><s id="pjuwb"><rt id="pjuwb"></rt></s></fieldset></cite><big id="pjuwb"><progress id="pjuwb"><big id="pjuwb"></big></progress></big><samp id="pjuwb"><delect id="pjuwb"></delect></samp><dl id="pjuwb"></dl><strike id="pjuwb"><nav id="pjuwb"><dl id="pjuwb"><strong id="pjuwb"></strong></dl></nav></strike><tbody id="pjuwb"><b id="pjuwb"><optgroup id="pjuwb"><rp id="pjuwb"></rp></optgroup></b></tbody><em id="pjuwb"></em><xmp id="pjuwb"><blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote></xmp> <i id="pjuwb"><abbr id="pjuwb"><i id="pjuwb"><abbr id="pjuwb"></abbr></i></abbr></i><center id="pjuwb"><acronym id="pjuwb"><center id="pjuwb"></center></acronym></center><pre id="pjuwb"></pre><ul id="pjuwb"><thead id="pjuwb"></thead></ul><blockquote id="pjuwb"><pre id="pjuwb"><sup id="pjuwb"></sup></pre></blockquote><acronym id="pjuwb"></acronym><big id="pjuwb"><s id="pjuwb"></s></big><th id="pjuwb"></th><th id="pjuwb"></th><tbody id="pjuwb"></tbody><thead id="pjuwb"><strike id="pjuwb"></strike></thead><th id="pjuwb"><dl id="pjuwb"><wbr id="pjuwb"></wbr></dl></th><dl id="pjuwb"><strong id="pjuwb"></strong></dl><abbr id="pjuwb"><noframes id="pjuwb"><noscript id="pjuwb"></noscript></noframes></abbr><td id="pjuwb"><ol id="pjuwb"></ol></td><li id="pjuwb"><noscript id="pjuwb"><abbr id="pjuwb"></abbr></noscript></li><small id="pjuwb"><bdo id="pjuwb"><nav id="pjuwb"></nav></bdo></small><style id="pjuwb"></style><optgroup id="pjuwb"><table id="pjuwb"></table></optgroup><center id="pjuwb"><tr id="pjuwb"><dfn id="pjuwb"></dfn></tr></center><th id="pjuwb"></th><u id="pjuwb"></u><tfoot id="pjuwb"><legend id="pjuwb"><i id="pjuwb"></i></legend></tfoot><mark id="pjuwb"></mark><meter id="pjuwb"></meter><nav id="pjuwb"></nav><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><nobr id="pjuwb"></nobr><sub id="pjuwb"><th id="pjuwb"><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem></th></sub><thead id="pjuwb"><sub id="pjuwb"></sub></thead><ul id="pjuwb"><address id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></address></ul><dfn id="pjuwb"></dfn><pre id="pjuwb"></pre><input id="pjuwb"><cite id="pjuwb"><fieldset id="pjuwb"></fieldset></cite></input><u id="pjuwb"><form id="pjuwb"><u id="pjuwb"></u></form></u><kbd id="pjuwb"><em id="pjuwb"><mark id="pjuwb"></mark></em></kbd><tr id="pjuwb"></tr><del id="pjuwb"><form id="pjuwb"><address id="pjuwb"></address></form></del><tfoot id="pjuwb"><legend id="pjuwb"><ol id="pjuwb"><dl id="pjuwb"></dl></ol></legend></tfoot><menu id="pjuwb"><nobr id="pjuwb"><th id="pjuwb"><nobr id="pjuwb"></nobr></th></nobr></menu><fieldset id="pjuwb"></fieldset><pre id="pjuwb"><blockquote id="pjuwb"><samp id="pjuwb"></samp></blockquote></pre><xmp id="pjuwb"><sup id="pjuwb"><pre id="pjuwb"></pre></sup></xmp><span id="pjuwb"><progress id="pjuwb"></progress></span><font id="pjuwb"></font><var id="pjuwb"><abbr id="pjuwb"></abbr></var><strong id="pjuwb"><label id="pjuwb"><i id="pjuwb"><legend id="pjuwb"></legend></i></label></strong><tr id="pjuwb"><em id="pjuwb"><em id="pjuwb"><output id="pjuwb"></output></em></em></tr><thead id="pjuwb"><strike id="pjuwb"></strike></thead> <acronym id="pjuwb"></acronym><i id="pjuwb"></i><tt id="pjuwb"></tt><rt id="pjuwb"><source id="pjuwb"><rt id="pjuwb"></rt></source></rt><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike><del id="pjuwb"></del><font id="pjuwb"><output id="pjuwb"><ins id="pjuwb"><output id="pjuwb"></output></ins></output></font><kbd id="pjuwb"><tr id="pjuwb"><kbd id="pjuwb"></kbd></tr></kbd><pre id="pjuwb"><sup id="pjuwb"><delect id="pjuwb"><samp id="pjuwb"></samp></delect></sup></pre><samp id="pjuwb"></samp><track id="pjuwb"></track><tr id="pjuwb"></tr><center id="pjuwb"></center><fieldset id="pjuwb"></fieldset><i id="pjuwb"></i><td id="pjuwb"></td><rt id="pjuwb"></rt><object id="pjuwb"></object><pre id="pjuwb"><progress id="pjuwb"><sub id="pjuwb"><thead id="pjuwb"></thead></sub></progress></pre><kbd id="pjuwb"><tr id="pjuwb"><option id="pjuwb"></option></tr></kbd><output id="pjuwb"><ins id="pjuwb"></ins></output><ol id="pjuwb"></ol><source id="pjuwb"></source><strong id="pjuwb"></strong><ruby id="pjuwb"></ruby><sub id="pjuwb"><meter id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></meter></sub><pre id="pjuwb"></pre><center id="pjuwb"></center><tr id="pjuwb"><tbody id="pjuwb"><xmp id="pjuwb"><dd id="pjuwb"></dd></xmp></tbody></tr><video id="pjuwb"></video><pre id="pjuwb"></pre><form id="pjuwb"><optgroup id="pjuwb"></optgroup></form><samp id="pjuwb"></samp><kbd id="pjuwb"></kbd><strong id="pjuwb"><option id="pjuwb"></option></strong><object id="pjuwb"></object><abbr id="pjuwb"><noframes id="pjuwb"><abbr id="pjuwb"></abbr></noframes></abbr><ul id="pjuwb"><del id="pjuwb"><button id="pjuwb"><pre id="pjuwb"></pre></button></del></ul><abbr id="pjuwb"></abbr><strong id="pjuwb"><code id="pjuwb"><strong id="pjuwb"></strong></code></strong><option id="pjuwb"></option><optgroup id="pjuwb"><bdo id="pjuwb"><code id="pjuwb"></code></bdo></optgroup><mark id="pjuwb"><em id="pjuwb"><font id="pjuwb"></font></em></mark><acronym id="pjuwb"><code id="pjuwb"></code></acronym><dl id="pjuwb"></dl><em id="pjuwb"></em><object id="pjuwb"><input id="pjuwb"><object id="pjuwb"></object></input></object><output id="pjuwb"><dd id="pjuwb"></dd></output><option id="pjuwb"><button id="pjuwb"><option id="pjuwb"></option></button></option><small id="pjuwb"></small></div> <a href="http://ww9494.com" target="_blank">亚洲国产成人精品视频</a>| <a href="http://montnove.com" target="_blank">极品尤物av久久免费看 </a>| <a href="http://xhs015.com" target="_blank">欧美激情麻豆</a>| <a href="http://6567ya.com" target="_blank">亚洲精品护士</a>| <a href="http://j88866.com" target="_blank">久久综合中文色婷婷</a>| <a href="http://855821.com" target="_blank">日韩一级精品</a>| <a href="http://www-440450.com" target="_blank">亚洲国产成人av好男人在线观看</a>| <a href="http://yyyy456.com" target="_blank">欧美区视频在线观看</a>| <a href="http://5gn4y.com" target="_blank">午夜精品免费在线</a>| <a href="http://49028b.com" target="_blank">在线天堂一区av电影</a>| <a href="http://360inns.com" target="_blank">欧美激情一区二区三区全黄</a>| <a href="http://dgxinshidai.com" target="_blank">亚洲影院高清在线</a>| <a href="http://www-4997.com" target="_blank">亚洲乱码一区二区</a>| <a href="http://wo6wo.com" target="_blank">亚洲剧情一区二区</a>| <a href="http://11b29.com" target="_blank">日韩亚洲欧美精品</a>| <a href="http://submro.com" target="_blank">洋洋av久久久久久久一区</a>| <a href="http://cgnwp.com" target="_blank">韩国一区二区三区美女美女秀</a>| <a href="http://22abb.com" target="_blank">国产精品久久久久毛片软件 </a>| <a href="http://win-mdk.com" target="_blank">怡红院av一区二区三区</a>| <a href="http://fsdashen.com" target="_blank">国产精品美女视频网站</a>| <a href="http://www55747.com" target="_blank">久久激情综合网</a>| <a href="http://cz-hongbangfloor.com" target="_blank">夜夜嗨av一区二区三区四季av</a>| <a href="http://457745.com" target="_blank">激情久久久久</a>| <a href="http://342008.com" target="_blank">在线观看av不卡</a>| <a href="http://phdy999.com" target="_blank">亚洲国产一区二区三区青草影视</a>| <a href="http://663747.com" target="_blank">99精品国产在热久久下载</a>| <a href="http://dkmcjc.com" target="_blank">久久综合九色综合欧美就去吻 </a>| <a href="http://y65c.com" target="_blank">狂野欧美激情性xxxx</a>| <a href="http://9885888.com" target="_blank">99国内精品</a>| <a href="http://988tz.com" target="_blank">欧美日韩一区二区三区在线 </a>| <a href="http://kk66mm.com" target="_blank">国产精品一区免费视频</a>| <a href="http://k68c.com" target="_blank">国产原创一区二区</a>| <a href="http://www18889.com" target="_blank">午夜精品理论片</a>| <a href="http://188293.com" target="_blank">亚洲一区二区三区四区视频 </a>| <a href="http://zhipiao998.com" target="_blank">久久久综合激的五月天</a>| <a href="http://789469.com" target="_blank">老色鬼精品视频在线观看播放</a>| <a href="http://9kkkb.com" target="_blank">欧美xx69</a>| <a href="http://9113i.com" target="_blank">国产视频在线一区二区</a>| <a href="http://1277k.com" target="_blank">亚洲缚视频在线观看</a>| <a href="http://zjkgjt.com" target="_blank">亚洲视频综合在线</a>| <a href="http://ybshg.com" target="_blank">亚洲国产精品va在看黑人</a>| <a href="http://599107.com" target="_blank">欧美激情亚洲综合一区</a>| <a href="http://9ctv2.com" target="_blank">亚洲欧美一区二区三区极速播放 </a>| <a href="http://227c7.com" target="_blank">久久另类ts人妖一区二区</a>| <a href="http://erosgems.com" target="_blank">亚洲欧美日韩国产精品 </a>| <a href="http://wwwavtb1122.com" target="_blank">国产精品久久午夜</a>| <a href="http://555346.com" target="_blank">一区二区三区 在线观看视频</a>| <a href="http://67idid.com" target="_blank">老司机免费视频一区二区</a>| <a href="http://www94816.com" target="_blank">亚洲欧美日韩视频一区</a>| <a href="http://b476.com" target="_blank">国产麻豆精品视频</a>| <a href="http://sdsptl.com" target="_blank">欧美自拍偷拍</a>| <a href="http://oimeal.com" target="_blank">久久亚洲精品伦理</a>| <a href="http://xindefalv.com" target="_blank">91久久国产综合久久</a>| <a href="http://www-4890.com" target="_blank">欧美成人免费va影院高清</a>| <a href="http://miya2223.com" target="_blank">欧美成人一区二免费视频软件</a>| <a href="http://xxxbobba.com" target="_blank">亚洲成人在线</a>| <a href="http://submro.com" target="_blank">亚洲欧洲精品一区</a>| <a href="http://85181890.com" target="_blank">国产精品国产</a>| <a href="http://www-36900.com" target="_blank">久久五月激情</a>| <a href="http://798200.com" target="_blank">欧美三级在线</a>| <a href="http://400206.com" target="_blank">久热精品在线视频</a>| <a href="http://4106446.com" target="_blank">欧美精品久久久久久</a>| <a href="http://18av18.com" target="_blank">亚洲欧美日本精品</a>| <a href="http://yunyang0991.com" target="_blank">久久精品国产精品亚洲</a>| <a href="http://www-787788.com" target="_blank">日韩一级精品</a>| <a href="http://3c3c3c.com" target="_blank">久久久久国产精品www </a>| <a href="http://www4455va.com" target="_blank">久久一区精品</a>| <a href="http://666cmc.com" target="_blank">亚洲先锋成人</a>| <a href="http://www515678.com" target="_blank">欧美一级黄色录像</a>| <a href="http://32m8.com" target="_blank">欧美成年人视频网站</a>| <a href="http://91mdtv.com" target="_blank">亚洲日本久久</a>| <a href="http://www-3121.com" target="_blank">日韩西西人体444www</a>| <a href="http://cczm4.com" target="_blank">国产一区二区三区四区在线观看</a>| <a href="http://qhzyxcd.com" target="_blank">欧美成年人视频</a>| <a href="http://www-e2222.com" target="_blank">国产综合第一页</a>| <a href="http://cuucs.com" target="_blank">亚洲中午字幕</a>| <a href="http://744734.com" target="_blank">亚洲在线免费</a>| <a href="http://44cgcg.com" target="_blank">亚洲大片在线观看</a>| <a href="http://520844www.com" target="_blank">欧美色欧美亚洲另类二区</a>| <a href="http://85041960.com" target="_blank">91久久精品国产91性色tv</a>| <a href="http://tigerpowerinc.com" target="_blank">精品福利免费观看</a>| <a href="http://551731.com" target="_blank">久久偷看各类wc女厕嘘嘘偷窃</a>| <a href="http://maisuper.com" target="_blank">久久久精品2019中文字幕神马</a>| <a href="http://nn99dd.com" target="_blank">欧美激情精品久久久久久大尺度</a>| <a href="http://fxsdcj.com" target="_blank">欧美视频中文在线看</a>| <a href="http://uuuu79.com" target="_blank">国产精品日日摸夜夜添夜夜av</a>| <a href="http://4449998.com" target="_blank">日韩一区二区福利</a>| <a href="http://hznaja.com" target="_blank">韩国在线视频一区</a>| <a href="http://kk8586.com" target="_blank">91久久香蕉国产日韩欧美9色</a>| <a href="http://97gaoba.com" target="_blank">欧美aaa级</a>| <a href="http://bx989.com" target="_blank">欧美成人a视频</a>| <a href="http://7343888.com" target="_blank">亚洲高清不卡在线观看</a>| <a href="http://avse98.com" target="_blank">亚洲级视频在线观看免费1级</a>| <a href="http://hnjlhgw.com" target="_blank">欧美日韩性生活视频</a>| <a href="http://9lunli.com" target="_blank">欧美一区影院</a>| <a href="http://51shoudian.com" target="_blank">欧美成人乱码一区二区三区</a>| <a href="http://8888590.com" target="_blank">亚洲午夜激情</a>| <a href="http://7788444.com" target="_blank">久久久人成影片一区二区三区 </a>| <a href="http://wallypanel.com" target="_blank">在线亚洲欧美视频</a>| <a href="http://126film.com" target="_blank">国产亚洲制服色</a>| <a href="http://miaoxp.com" target="_blank">亚洲国产欧美日韩精品</a>| <a href="http://xaxkizlar.com" target="_blank">欧美午夜精品伦理</a>| <a href="http://jm1688e.com" target="_blank">美国成人毛片</a>| <a href="http://www-13413.com" target="_blank">欧美视频手机在线</a>| <a href="http://tv-miya188.com" target="_blank">久久久久免费观看</a>| <a href="http://cqrehoo.com" target="_blank">欧美激情1区2区3区</a>| <a href="http://20074972.com" target="_blank">欧美一区二区三区四区在线观看地址</a>| <a href="http://88xjj.com" target="_blank">欧美一站二站</a>| <a href="http://345kt.com" target="_blank">亚洲福利视频网</a>| <a href="http://ynzhuoyi.com" target="_blank">免费在线成人av</a>| <a href="http://sihu1515hh.com" target="_blank">欧美精品久久久久a</a>| <a href="http://www-44469.com" target="_blank">亚洲视频精品在线</a>| <a href="http://czsanlin.com" target="_blank">香蕉视频成人在线观看</a>| <a href="http://3bmmxyz.com" target="_blank">亚洲福利在线看</a>| <a href="http://eguge.com" target="_blank">亚洲图片在线观看</a>| <a href="http://32tun.com" target="_blank">在线观看国产成人av片</a>| <a href="http://97seee.com" target="_blank">亚洲剧情一区二区</a>| <a href="http://www-ty66.com" target="_blank">国产欧美成人</a>| <a href="http://jzsp87.com" target="_blank">欧美激情亚洲</a>| <a href="http://556626.com" target="_blank">欧美视频福利</a>| <a href="http://7467tom.com" target="_blank">免费亚洲一区二区</a>| <a href="http://www-474736.com" target="_blank">国产精品xnxxcom</a>| <a href="http://chaoxibg.com" target="_blank">免费成人性网站</a>| <a href="http://6k6a.com" target="_blank">欧美色图麻豆</a>| <a href="http://cca22.com" target="_blank">免费h精品视频在线播放</a>| <a href="http://77smsm.com" target="_blank">国产日韩欧美一二三区</a>| <a href="http://scptw.com" target="_blank">亚洲国产精品美女</a>| <a href="http://sifeksa.com" target="_blank">国产一区二区三区久久悠悠色av</a>| <a href="http://tk99444.com" target="_blank">亚洲国产精品999</a>| <a href="http://zzzz80.com" target="_blank">9l国产精品久久久久麻豆</a>| <a href="http://zhipiao998.com" target="_blank">麻豆精品一区二区av白丝在线</a>| <a href="http://china-cvct.com" target="_blank">欧美三区在线观看</a>| <a href="http://8888590.com" target="_blank">麻豆成人av</a>| <a href="http://woaigougou.com" target="_blank">国产精品久久久久一区二区</a>| <a href="http://799868.com" target="_blank">免费高清在线视频一区·</a>| <a href="http://cz-sensor.com" target="_blank">欧美午夜精品久久久久久浪潮</a>| <a href="http://798814.com" target="_blank">毛片一区二区三区</a>| <a href="http://yckjwb.com" target="_blank">亚洲成人自拍视频</a>| <a href="http://345kt.com" target="_blank">亚欧美中日韩视频</a>| <a href="http://583775.com" target="_blank">亚洲免费一在线</a>| <a href="http://77777kkk.com" target="_blank">欧美激情第三页</a>| <a href="http://hkbsi.com" target="_blank">欧美成人免费在线视频</a>| <a href="http://hu62.com" target="_blank">欧美一区二区三区四区在线</a>| <a href="http://060607.com" target="_blank">欧美在线一级va免费观看</a>| <a href="http://3dprintingferuima.com" target="_blank">欧美日产一区二区三区在线观看</a>| <a href="http://6168138.com" target="_blank">亚洲男人的天堂在线</a>| <a href="http://www94816.com" target="_blank">欧美国产国产综合</a>| <a href="http://aaa211.com" target="_blank">欧美在线视频免费</a>| <a href="http://xhs1039.com" target="_blank">国产精品久久久久久av福利软件</a>| <a href="http://wwwavtb1122.com" target="_blank">欧美激情一区三区</a>| <a href="http://caoav8.com" target="_blank">亚洲高清三级视频</a>| <a href="http://65kf.com" target="_blank">久久精品国产清高在天天线</a>| <a href="http://77777gao.com" target="_blank">午夜欧美不卡精品aaaaa</a>| <a href="http://88844401.com" target="_blank">欧美日韩一区二区在线播放</a>| <a href="http://wocao1997.com" target="_blank">亚洲精品1234</a>| <a href="http://csjtzn.com" target="_blank">99精品欧美一区二区蜜桃免费</a>| <a href="http://173881.com" target="_blank">欧美在线观看网站</a>| <a href="http://spvicarb.com" target="_blank">欧美不卡视频</a>| <a href="http://aiqianfang.com" target="_blank">亚洲夫妻自拍</a>| <a href="http://428820.com" target="_blank">免费成人高清视频</a>| <a href="http://18p2.com" target="_blank">亚洲大片在线</a>| <a href="http://avtb2120.com" target="_blank">日韩午夜av</a>| <a href="http://ylsnuha.com" target="_blank">国产精品色婷婷久久58</a>| <a href="http://432dm.com" target="_blank">亚洲性线免费观看视频成熟</a>| <a href="http://by3787.com" target="_blank">亚洲男人第一网站</a>| <a href="http://9273829.com" target="_blank">国产精品一区二区女厕厕</a>| <a href="http://036762.com" target="_blank">午夜日韩电影</a>| <a href="http://by66336.com" target="_blank">久久久噜噜噜久久中文字免</a>| <a href="http://www-88899.com" target="_blank">国产亚洲综合精品</a>| <a href="http://by66336.com" target="_blank">久久精品国产久精国产一老狼 </a>| <a href="http://by4425.com" target="_blank">亚洲国产成人精品视频</a>| <a href="http://6055365.com" target="_blank">在线精品视频在线观看高清</a>| <a href="http://woniuminsu.com" target="_blank">久久精品视频在线播放</a>| <a href="http://aqdit2022.com" target="_blank">久久亚洲免费</a>| <a href="http://22400com.com" target="_blank">国产日产欧美a一级在线</a>| <a href="http://www308eee.com" target="_blank">久久久久久欧美</a>| <a href="http://emu160.com" target="_blank">欧美国产先锋</a>| <a href="http://fanwenok.com" target="_blank">日韩一二三在线视频播</a>| <a href="http://10669p.com" target="_blank">欧美性淫爽ww久久久久无</a>| <a href="http://www5566szy.com" target="_blank">亚洲成色777777在线观看影院</a>| <a href="http://cz-hongbangfloor.com" target="_blank">99国产精品国产精品毛片</a>| <a href="http://o10669.com" target="_blank">欧美日韩久久</a>| <a href="http://5207877.com" target="_blank">午夜精品久久久</a>| <a href="http://p5555ww.com" target="_blank">免费看av成人</a>| <a href="http://www559955.com" target="_blank">99成人在线</a>| <a href="http://jnhrjixie.com" target="_blank">在线观看日韩欧美</a>| <a href="http://eee285.com" target="_blank">欧美日本精品</a>| <a href="http://www-5013.com" target="_blank">午夜国产精品影院在线观看</a>| <a href="http://xuanxuan88.com" target="_blank">久久在线播放</a>| <a href="http://xprinter3d.com" target="_blank">在线免费观看欧美</a>| <a href="http://1397h.com" target="_blank">国产精品一区久久</a>| <a href="http://sinojinxing.com" target="_blank">久久免费视频在线</a>| <a href="http://wwzz3.com" target="_blank">99亚洲一区二区</a>| <a href="http://489633.com" target="_blank">久久人91精品久久久久久不卡 </a>| <a href="http://388268.com" target="_blank">亚洲乱码一区二区</a>| <a href="http://ff9222.com" target="_blank">影音先锋亚洲视频</a>| <a href="http://3534m.com" target="_blank">国产精品一区毛片</a>| <a href="http://hjk56.com" target="_blank">欧美成人精品h版在线观看</a>| <a href="http://www-35777.com" target="_blank">中文网丁香综合网</a>| <a href="http://744734.com" target="_blank">欧美成人午夜激情</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>