• <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);
            久久国产精品视频| 精品久久久久久久久久久久久久久| 久久精品视频91| 亚洲午夜精品久久久久久app| 四虎国产精品成人免费久久| 亚洲日韩欧美一区久久久久我| 久久亚洲AV成人无码软件| 亚洲精品乱码久久久久久蜜桃不卡| www.久久热| 亚洲国产婷婷香蕉久久久久久| 无遮挡粉嫩小泬久久久久久久| 伊人久久综合热线大杳蕉下载| 久久精品视频网| 久久夜色撩人精品国产| 久久久久高潮综合影院| 久久99精品国产一区二区三区| 色播久久人人爽人人爽人人片AV| 久久99精品久久久久久| 亚洲午夜久久久久久久久久| 久久AAAA片一区二区| 国产亚洲欧美精品久久久| 久久精品国产只有精品66| 国产精品久久久久9999高清| 免费久久人人爽人人爽av| 九九久久精品无码专区| 99久久无色码中文字幕| 精品人妻伦九区久久AAA片69 | 国产精品va久久久久久久| 波多野结衣久久| 久久亚洲精品无码播放| 久久精品国产99国产电影网 | 伊人久久大香线蕉亚洲| 青青久久精品国产免费看| 亚洲综合久久综合激情久久| 精品国产VA久久久久久久冰| 亚洲午夜久久久久久噜噜噜| 久久久久亚洲AV片无码下载蜜桃| 99热都是精品久久久久久| 97超级碰碰碰碰久久久久| 国产精品久久久久久搜索| 99国产精品久久|