• <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>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            CAsyncSocket運作流程

            Posted on 2008-12-11 16:12 Prayer 閱讀(779) 評論(0)  編輯 收藏 引用 所屬分類: SOCKET
            使用CAsyncSocket時,Send流程和Recieve流程是不同的,不理解這
            一點就不可能順利使用CAsyncSocket。

            MSDN對CAsyncSocket的解釋很容易讓你理解為:只有OnSend被觸發時
            你Send才有意義,你才應該Send,同樣只有OnRecieve被觸發時你才
            應該Recieve。很不幸,你錯了:

            你會發現,連接建立的同時,OnSend就第一次被觸發了,嗯,這很好,
            但你現在還不想Send,你讓OnSend返回,干點其他的事情,等待下一
            次OnSend試試看?實際上,你再也等不到OnSend被觸發了。因為,除
            了第一次以外,OnSend的任何一次觸發,都源于你調用了Send,但碰
            到了WSAEWOULDBLOCK或只完成了部分發送!

            所以,使用CAsyncSocket時,針對發送的流程邏輯應該是:你需兩個
            成員變量,一個發送任務表,一個記錄發送進度。你可以,也應該,
            在任何你需要的時候,主動調用Send來發送數據,同時更新任務表和
            發送進度。而OnSend,則是你的負責擦屁股工作的助手,它被觸發時
            要干的事情就是根據任務表和發送進度調用Send繼續發,若此次發送
            沒能將任務表全部發送完成,根據發送結果更新發送進度;若任務表
            已全部發送完畢,則清空任務表及發送進度。

            使用CAsyncSocket的接收流程邏輯是不同的:你永遠不需要主動調用
            Recieve,你只應該在OnRecieve中等待。由于你不可能知道將要抵達
            的數據類型及次序,所以你需要一個成員變量來存儲已收到但尚未處
            理的數據。每次OnRecieve被觸發,你只需要被動調用一次Recieve來
            接受固定長度的數據,并添加到你的已收數據表后。然后你需要掃描
            已收數據表,若其中已包含一條或數條完整的可解析的業務數據包,
            截取出來,調用主線程的處理函數來處理或作為消息參數發送給主線
            程。而已收數據表中剩下的數據,將等待下次OnRecieve中被再次組合
            、掃描并處理。

            長連接應用中,連接可能因為各種原因中斷,所以你需要自動重連。
            你需要根據CAsyncSocket的成員變量m_hSocket來判斷當前連接狀態:
            if(m_hSocket==INVALID_SOCKET)
            當然,很奇怪的是,即使連接已經中斷,OnClose也已經被觸發,你
            還是需要在OnClose中調用Close,否則m_hSocket并不會被自動賦值
            為INVALID_SOCKET。

            在很多長連接應用中,除建立連接以外,還需要先Login,然后才能
            進行業務處理,連接并Login是一個步驟依賴性過程,用異步方式處
            理反而會很麻煩,而CAsyncSocket是支持切換為同步模式的,你應該
            掌握在適當的時候切換同異步模式的方法:

            DWORD dw;

            //切換為同步模式
            dw=0;
            IOCtl(FIONBIO,&dw);
            ...

            //切換回異步模式
            dw=1;
            IOCtl(FIONBIO,&dw);
            狠狠色婷婷久久一区二区 | 久久99精品久久久久久秒播| 精品熟女少妇aⅴ免费久久| 久久久久香蕉视频| 伊人久久大香线蕉av一区| 久久久久国产精品| 国产69精品久久久久APP下载 | 国产精品成人久久久| www性久久久com| 亚洲精品第一综合99久久| 精品久久人妻av中文字幕| 久久久久久国产a免费观看黄色大片 | 久久激情五月丁香伊人| 亚洲va中文字幕无码久久| 久久精品亚洲精品国产欧美| 久久99久久99精品免视看动漫| 国产精品成人99久久久久 | 欧美亚洲国产精品久久高清| 婷婷综合久久中文字幕| 色偷偷88888欧美精品久久久| 久久精品国产一区二区| 久久电影网一区| 久久精品国产亚洲av高清漫画| 国产精品一区二区久久精品涩爱| 999久久久国产精品| 欧美伊香蕉久久综合类网站| 国产精品久久久天天影视| 久久一日本道色综合久久| 亚洲中文字幕久久精品无码喷水| 伊人情人综合成人久久网小说| 久久久久国产成人精品亚洲午夜| 久久亚洲精品中文字幕三区| 久久亚洲国产午夜精品理论片| 久久精品毛片免费观看| 精品熟女少妇av免费久久| 久久精品国产亚洲av麻豆小说 | 欧美亚洲日本久久精品| 天天综合久久一二三区| 一本久久精品一区二区| 久久夜色精品国产欧美乱| 国产精品99久久免费观看|