• <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 閱讀(765) 評論(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);
            久久精品一区二区三区中文字幕| 9久久9久久精品| 精品久久久久久无码不卡| 久久九九久精品国产免费直播| 色偷偷偷久久伊人大杳蕉| 精品久久久久久无码中文字幕 | 国产精品99久久免费观看| 天天综合久久久网| 亚洲色大成网站www久久九| 2021精品国产综合久久| 午夜精品久久久久久影视riav| 国产精品99久久精品| 久久人人爽人人爽人人爽 | 午夜精品久久久久久久无码| 日韩精品久久无码中文字幕| 久久激情五月丁香伊人| 91精品国产91久久综合| 久久精品国产亚洲AV香蕉| 国产精品美女久久久网AV| 久久精品人人做人人爽97| 欧美久久天天综合香蕉伊| 青青青国产精品国产精品久久久久| 热99RE久久精品这里都是精品免费| 99久久婷婷国产综合精品草原| 久久久av波多野一区二区| 亚洲精品国精品久久99热| 777久久精品一区二区三区无码 | 久久丫精品国产亚洲av| 久久SE精品一区二区| 久久乐国产综合亚洲精品| 亚洲国产成人久久笫一页| 久久久久亚洲爆乳少妇无| 久久精品成人| 久久天天躁狠狠躁夜夜av浪潮 | 无码国内精品久久综合88 | 久久精品国产亚洲Aⅴ蜜臀色欲| 国产精品美女久久久久久2018| 五月丁香综合激情六月久久| 国产精品久久新婚兰兰| 国产69精品久久久久观看软件| 伊人久久大香线蕉综合5g|