一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

c++編程IOCP中的socket錯誤和資源釋放處理方法

 牛人的尾巴 2017-01-09

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

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

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

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

首先, 我們假設, 是在get函數(shù)返回時統(tǒng)一進行相應的釋放和關閉操作.

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

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

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

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    精品日韩视频在线观看| 在线免费国产一区二区| 亚洲欧美日韩国产自拍| 精品国模一区二区三区欧美| 成人午夜免费观看视频| 91亚洲国产日韩在线| 欧美日韩国产的另类视频| 久久国产精品热爱视频| 国产精品一区日韩欧美| 日本成人中文字幕一区| 日韩欧美一区二区不卡看片| 日本午夜免费观看视频| 亚洲一区二区三区三区| 富婆又大又白又丰满又紧又硬| 日韩人妻一区中文字幕| 婷婷色网视频在线播放| 日韩精品成区中文字幕| 国产一区国产二区在线视频| 丝袜美女诱惑在线观看| 精品国产一区二区欧美| 国产一区二区三区香蕉av| 99久久免费看国产精品| 日韩精品中文字幕亚洲| 人妻人妻人人妻人人澡| 国产精品一区二区三区激情| 亚洲精品中文字幕一二三| 欧洲日本亚洲一区二区| 在线免费国产一区二区三区| 国产精品午夜福利免费阅读| 欧美亚洲美女资源国产| 欧美丰满大屁股一区二区三区| 大伊香蕉一区二区三区| 欧美激情视频一区二区三区| 日韩精品人妻少妇一区二区| 日本一本不卡免费视频| 精产国品一二三区麻豆| 国产av一区二区三区久久不卡| 日韩欧美一区二区不卡看片| 99久久精品国产日本| 国产午夜免费在线视频| 国产精品一区二区不卡中文 |