• <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 閱讀(769) 評論(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);
            最新久久免费视频| 亚洲精品tv久久久久| 亚洲精品乱码久久久久久按摩| 亚洲日本va中文字幕久久| 午夜天堂av天堂久久久| 久久精品视频免费| 久久婷婷五月综合成人D啪| 久久久久亚洲AV片无码下载蜜桃| 久久精品嫩草影院| 无码人妻久久一区二区三区蜜桃| 亚洲AV无码久久| 国产精品免费久久久久久久久 | 亚洲熟妇无码另类久久久| 久久精品人人做人人妻人人玩| 国产精品成人无码久久久久久 | 激情久久久久久久久久| 国内精品综合久久久40p| 国产激情久久久久影院老熟女| 亚洲国产欧美国产综合久久| 久久综合九色综合久99| 色欲综合久久躁天天躁蜜桃| 久久综合一区二区无码| 久久精品男人影院| 99久久中文字幕| 精品久久久久久国产| 精品久久国产一区二区三区香蕉| 久久精品人人做人人妻人人玩| 中文字幕亚洲综合久久菠萝蜜| 国产精品无码久久综合网| 久久精品中文字幕久久| 久久影院综合精品| 亚洲国产另类久久久精品黑人| 无码国内精品久久人妻麻豆按摩| 国产成人精品久久| 久久av免费天堂小草播放| 99久久免费国产精品| 91麻豆精品国产91久久久久久| AA级片免费看视频久久| 国产成人久久777777| 久久久噜噜噜久久| 久久天天躁狠狠躁夜夜avapp|