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

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            IOCP中的socket錯誤和資源釋放處理方法

            本文出處:http://blog.csdn.net/sodme
            聲明:本文可以不經作者同意任意轉載、復制、傳播,但任何對本文的引用均須保留本文的作者、出處及本行聲明信息!謝謝!

            前言:?
            錯誤處理和socket釋放, 是IOCP編程中的一大難點. 本文試圖就IOCP設計中經常遇到的這個難題展開論述并尋找其解決方案, 事實上, 文中所述的解決方式不僅僅適用于IOCP, 它同樣適用于EPOLL等多種服務器編程的網絡模型中, 前提是: 領會這種處理方式的實質.

            正文:
            在使用IOCP開發時, 大家經常遇到的一個難題是與socket相關的緩沖區釋放不當帶來的錯誤, 這種錯誤通常是由于多次對同一個指針執行了delete操作引起的. 比如, 當在執行wsasend或wsarecv返回了非pending的錯誤信息時, 我們就要對此錯誤進行處理, 通常情況下, 我們會想到執行這兩步操作:
            a. 釋放此次操作使用的緩沖區數據(如果不釋放可能造成內存泄漏);
            b. 關閉當前操作所使用的socket.
            而另一方面, 我們可能也會在get函數(GetQueuedCompletionStatus)的處理中, 當get函數返回值為FALSE時也作這兩步相同的操作.? 此時, 就會造成對同一緩沖區的重復釋放, 問題由此產生.

            解決的方法, 可以有這幾種:
            1. 對數據緩沖區使用引用計數機制;
            2. 在clientsock的對象設計機制上使釋放操作線性化.
            關于這兩種方法, 任何一種如果要詳細說清, 可能篇幅都會比較長, 筆者并無耐心和精力將每一個細節都一一道來, 在此僅選第2種方案的關鍵步驟和核心思想來與大家分享.

            由前面對問題的描述可以看出, 造成多次釋放的原因可能是在執行收發操作和GET函數返回值為FALSE時, 我們重復執行了釋放操作. 很自然地, 我們會想到,? 能不能把這兩次釋放合并成一次釋放,? 這樣不就沒問題了嗎?? yes,? 這個思路是沒問題的.? 但要想讓這個思路能變成現實,? 需要在設計機制上對這個思路進行一定的支持.

            首先,? 我們假設, 是在get函數返回時統一進行相應的釋放和關閉操作.

            如果在執行wsasend操作時, 發生了非pending錯誤(io操作正在進行中), 而此時我們如果不釋放資源, 那至少得讓IOCP在GET返回時得知這個錯誤和發生錯誤時的緩沖區指針. 通知IOCP的方式, 是使用post函數(PostQueuedCompletionStatus)向IOCP拋一個特殊標志的消息, 這個特殊標志可以通過get函數的第二個參數, 即: 傳送字節數來表示, 可以選擇任何一個不可能出現的值, 比如任何一個跟它的初始值不相等的負數.? 當然, 如果你通過單句柄數據或單IO數據來傳遞也是可以的. 而發生錯誤的這個緩沖區指針, 我們是必須要通過單句柄數據或單IO數據來傳遞的. 但是, 從整個緩沖區的管理機制上來說, 我不推薦這樣的離散緩沖區機制, 我的建議是: 把收發緩沖區或數據隊列與相應的clientsocket對象相綁定, 釋放操作寫在該對象的析構函數里, 這樣當釋放clientsocket對象時就釋放了這些緩沖區.

            ok, 這樣一來, 在get函數里, 有三種情況需要執行釋放邏輯:
            1. get的返回值為FALSE;
            2. 傳送字節數為0;
            3. 接收到剛才我們post的那個錯誤類型消息.

            把釋放操作全放在get函數里以后, 對釋放操作的處理, 就比較統一了. 當然, 為了實現真正的線性化和元子化, 在釋放操作的最終執行邏輯上, 還需要對釋放代碼加鎖以實現線程互斥(當然, 這是在你開了多個工作者線程的情況下).

            posted on 2006-04-20 18:52 楊粼波 閱讀(888) 評論(0)  編輯 收藏 引用 所屬分類: 網絡編程

            伊人久久大香线蕉av一区| 99久久777色| 久久有码中文字幕| 午夜精品久久久久久影视777| 久久综合伊人77777| 人妻精品久久无码专区精东影业| 久久国产色AV免费看| 久久AAAA片一区二区| 老男人久久青草av高清| 久久综合久久久| 一本久道久久综合狠狠爱| 99久久亚洲综合精品网站| 久久久久亚洲AV成人网人人网站 | 久久亚洲国产欧洲精品一| 亚洲美日韩Av中文字幕无码久久久妻妇 | 精品乱码久久久久久久| 久久精品国产99久久香蕉| 久久人人爽爽爽人久久久| 亚洲精品无码久久不卡| 久久精品国产精品国产精品污| 伊人久久五月天| 国内精品久久久久国产盗摄| AV色综合久久天堂AV色综合在 | 久久精品国产亚洲av水果派| 亚洲人AV永久一区二区三区久久| 久久线看观看精品香蕉国产| 精品综合久久久久久97| 性欧美大战久久久久久久 | 久久综合偷偷噜噜噜色| 久久精品国产99久久香蕉| 狠狠色婷婷综合天天久久丁香| 7777久久久国产精品消防器材| 无码任你躁久久久久久| 久久精品成人欧美大片| 99久久99久久精品国产| 狠狠狠色丁香婷婷综合久久俺| 久久久久久久久久久久中文字幕| 99久久国产亚洲综合精品| 久久久久av无码免费网| 婷婷五月深深久久精品| 久久久无码一区二区三区|