青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉(zhuǎn),開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

編寫大容量和健壯的服務(wù)器系列—處理IOCP連接關(guān)閉  2007-08-11 14:45

分類:默認分類
字號: ? ?

?

?

鄧立波 深圳,2007-8

作者聯(lián)系方式 :

email: ???????? libodeng@gmail.com

msn:? ???????? libodeng@gmail.com

tel:???? ???????? 13510275799

版權(quán)/著作權(quán)所有 (C) 2007 鄧立波 保留所有權(quán)利

警告:未經(jīng)作者許可,任何人或組織不得轉(zhuǎn)載,公開發(fā)布,拷貝,傳播本文獻的全部或部分

??

及時監(jiān)測連接被動關(guān)閉

?????? 除非有特別要求,否則你應(yīng)該總是對每個連接保持一個掛起的接收 pending io

(使用 WSARecv 投遞)。如果用戶主動關(guān)閉連接,你的 GetQueuedCompletionStatus 調(diào)用將返回成功,但接收到的數(shù)據(jù)長度為 0 ,你能根據(jù)這點檢測連接是否已被對方關(guān)閉。如果連接被重置或者 io 被取消(如果你調(diào)用了 CancelIo 的話), GetQueuedCompletionStatus 將返回失敗,注意這時還應(yīng)該判斷 GetQueuedCompletionStatus 調(diào)用返回的 lpOverlapped 值,如果該值不為 NULL ,說明 iocp 已經(jīng)檢測到一個連接已經(jīng)中斷。

?

安全的關(guān)閉連接

?????? 很多人寫的服務(wù)器網(wǎng)絡(luò)庫有一個難以接受的缺陷(包括我曾就職公司的一些同事),當(dāng)服務(wù)器程序主動關(guān)閉連接時,剛發(fā)往客戶端的包有時出現(xiàn)丟失,這時他們推薦的方式往往是發(fā)送數(shù)據(jù)后等待幾秒再關(guān)閉連接。豪無疑問,這是一種笨拙的實現(xiàn)方式,他們遇到的問題根源是什么呢?

?????? 在非 IOCP 模式網(wǎng)絡(luò)程序中,你只要簡單的調(diào)用 closesocket 函數(shù)就可以確保數(shù)據(jù)在操作系統(tǒng)釋放 socket 之前安全到達對方,但在 IOCP 模式下,如果調(diào)用 closesocket 時有未決的 pending IO 將導(dǎo)致 socket 被重置,所以有時會出現(xiàn)數(shù)據(jù)丟失。正統(tǒng)的解決方式是使用 shutdown 函數(shù)(指定 SD_SEND 標(biāo)志),注意這時可能有未完成的發(fā)送 pengding IO ,所以你應(yīng)該監(jiān)測是否該連接的所有是否已完成(也許你要用一個計數(shù)器來跟蹤這些 pending IO ),僅在所有 send pending IO 完成后調(diào)用 shutdown

當(dāng)你調(diào)用 shutdown 時,也許數(shù)據(jù)仍然停留在操作系統(tǒng)的緩沖,操作系統(tǒng)將在數(shù)據(jù)發(fā)送完后發(fā)出一個 FIN 包來啟動關(guān)閉進程,客戶端接收完數(shù)據(jù)后,將接受到一個 0 長度的包,以此判斷連接已關(guān)閉(你寫的客戶端肯定有檢測連接關(guān)閉,不是嗎?),然后調(diào)用 closesocket ,這時服務(wù)器的 GetQueuedCompletionStatus 將接收到一個數(shù)據(jù)長度為 0 的包,這時你就可以調(diào)用 closesocket ,并釋放相關(guān)連接資源。

在絕大部分情況下上述的過程連接能完美的關(guān)閉。如果你特別注重服務(wù)器的安全性和健壯性,可能你還需要做一個“連接關(guān)閉隊列”,對每個已調(diào)用 shutdown 的連接放到這個隊列,然后定時的對這個隊列掃描,如果一個連接 5 秒(你也可以自己調(diào)整)還不能關(guān)閉,那么就強制關(guān)閉它。

?

處理大并發(fā)短連接時如何避免 TIME_WAIT 狀態(tài)

?????? 關(guān)于如何避免 TIME_WAIT 這個問題,一直沒看到有效的處理方式(至少我沒有), 我將在這里披露一種有效的方式。回到上一段,我們最后調(diào)用了 closesocket 關(guān)閉連接,這時仍然可能出現(xiàn) TIME_WAIT 狀態(tài),但注意這時所有的數(shù)據(jù)都已經(jīng)傳輸完畢,因此你可以強制關(guān)閉 socket 避免服務(wù)器連接進入 TIME_WAIT (這時只會發(fā)出連接重置 RESET 包)

// 立即關(guān)閉 ( 避免出現(xiàn) TIME_WAIT 狀態(tài) )

?????? ?????? LINGER linger = {1,0};

?????? ?????? setsockopt(socket, SOL_SOCKET, SO_LINGER,

????????????? ?????? (char *)&linger, sizeof(linger));

?

?

socket唯一性問題

正常情況下 SOCKET 套結(jié)字值是唯一的,但是操作系統(tǒng)在分配 socket 值時有隨機性,最近關(guān)閉的 socket 值可能重新分派給一個剛剛建立的新的 socket. ,尤其在大并發(fā)短連接的情況下。一個健壯的服務(wù)器 IOCP 網(wǎng)絡(luò)庫必須要考慮 socket 唯一性的問題,由于 IOCP 的排隊機制,意味著當(dāng)你調(diào)用 closesocket 關(guān)閉 socket 后, IOCP 隊列中可能仍然堆積了該 socket 的一些 I/O completion packet ,而此時,剛關(guān)閉的 socket 值又分派給一個剛剛建立的 socket ,所以,你必須對 GetQueuedCompletionStatus 獲取到的 I/O completion packet 小心翼翼處理,避免出現(xiàn)數(shù)據(jù)混亂,然而,最好的方式等到所有 I/O completion packet 返回后才調(diào)用 closesocket 關(guān)閉該 socket

?
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲人被黑人高潮完整版| 亚洲电影免费在线观看| 亚洲欧美日韩精品久久奇米色影视| 欧美激情黄色片| 亚洲欧美在线观看| 午夜精品亚洲一区二区三区嫩草| 午夜一区二区三视频在线观看| 亚洲欧美日韩中文在线制服| 亚洲欧美久久久| 久久久成人精品| 亚洲人成毛片在线播放| 91久久精品一区二区三区| 欧美电影美腿模特1979在线看| 欧美va天堂| 亚洲深夜福利| 快播亚洲色图| 国产在线不卡| a4yy欧美一区二区三区| 欧美成人福利视频| 欧美刺激性大交免费视频| 亚洲精品看片| 久久三级福利| 国产一区二区三区久久| 亚洲一区中文| 欧美电影免费观看大全| 国产精品极品美女粉嫩高清在线 | 亚洲毛片播放| 久久免费黄色| 狠狠色狠狠色综合日日91app| 一区二区欧美在线| 韩国在线视频一区| 亚洲午夜久久久| 亚洲精品视频在线| 欧美日韩精品在线| 亚洲精品国产精品乱码不99| 美女91精品| 欧美日本国产精品| 中国女人久久久| 一区二区三区四区五区精品视频 | 欧美成人精品影院| 亚洲电影免费观看高清完整版在线观看 | 亚洲欧洲日本国产| 美国成人直播| 一区二区91| 亚洲欧美日本伦理| 亚洲国产成人porn| 99re这里只有精品6| 国产一区二区三区日韩| 欧美电影在线观看| 国产精品高清在线| 鲁鲁狠狠狠7777一区二区| 欧美黑人多人双交| 欧美午夜电影在线| 午夜久久久久久| 久久婷婷国产麻豆91天堂| 99国产精品久久久久老师| 亚洲视频一区二区在线观看| 樱桃国产成人精品视频| 亚洲午夜一级| 一区二区三区四区五区在线| 久久久久久久久久久成人| 美女脱光内衣内裤视频久久影院| 亚洲人体1000| 久久久久久久高潮| 亚洲欧美日韩区| 欧美日韩免费看| 亚洲国内自拍| av成人免费在线| 欧美国产精品久久| 亚洲国产欧美不卡在线观看| 国内精品模特av私拍在线观看| 亚洲私人影院在线观看| 一区二区三区视频观看| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲欧美乱综合| 国产精品爽爽ⅴa在线观看| 99人久久精品视频最新地址| 中文久久精品| 国产九色精品成人porny| 午夜精品久久久久久久99热浪潮| 欧美一区二区三区在线看 | 小黄鸭精品aⅴ导航网站入口| 亚洲欧美精品一区| 国产欧美一区二区三区视频| 欧美在线观看一区二区三区| 狼人天天伊人久久| 亚洲精品一线二线三线无人区| 欧美xart系列高清| 在线视频精品一区| 国产精品久久久久一区二区三区共| 一区二区三区免费网站| 欧美有码在线观看视频| 亚洲精品黄色| 国产一区二区高清不卡| 另类欧美日韩国产在线| 一区二区三区免费网站| 欧美成人一区二区三区在线观看| 在线综合亚洲| 亚洲午夜高清视频| 欧美高清成人| 久久中文字幕一区二区三区| 这里是久久伊人| 亚洲伦理在线观看| 亚洲国产精品久久人人爱蜜臀 | 亚洲精品美女免费| 国内精品亚洲| 国产一区二区三区av电影| 国产精品亚洲人在线观看| 欧美黄色影院| 欧美日韩精品免费| 欧美日韩国产黄| 国产精品久久99| 国产精品久久久久影院色老大 | 欧美一区二区三区四区高清 | 午夜精品久久99蜜桃的功能介绍| 日韩视频第一页| 亚洲婷婷综合久久一本伊一区| 亚洲国产一成人久久精品| 激情另类综合| 91久久精品国产91性色| 亚洲国产美女| 亚洲永久免费视频| 久久久噜噜噜久久久| 亚洲国产老妈| 在线亚洲国产精品网站| 欧美一区免费视频| 欧美激情精品| 欧美日韩亚洲视频一区| a4yy欧美一区二区三区| 欧美视频二区| 欧美午夜精品久久久久久久| 国产精品高清一区二区三区| 国产日韩精品一区二区浪潮av| 国产日韩精品综合网站| 在线观看欧美日韩国产| 99精品黄色片免费大全| 久久激五月天综合精品| 亚洲高清不卡| 亚洲欧美春色| 欧美国产精品va在线观看| 国产人久久人人人人爽| 亚洲美女啪啪| 亚洲第一伊人| 亚洲综合999| 亚洲欧美日韩综合| 99v久久综合狠狠综合久久| 亚洲男人影院| 制服诱惑一区二区| 国产精品青草久久久久福利99| 亚洲精品国产精品乱码不99按摩 | 久久国产高清| 欧美一区激情视频在线观看| 国外成人在线视频网站| 欧美国产一区视频在线观看| 欧美日韩成人综合在线一区二区| 亚洲一区国产精品| 久久久久久久久久久久久女国产乱 | 曰韩精品一区二区| 91久久精品国产91性色| 午夜精品在线| 欧美承认网站| 美女精品在线观看| 国产精品素人视频| 欧美国产精品va在线观看| 久久香蕉国产线看观看av| 亚洲午夜精品一区二区| 毛片av中文字幕一区二区| 久久久av毛片精品| 国产精品推荐精品| 亚洲狼人精品一区二区三区| 亚洲福利视频一区| 乱码第一页成人| 亚洲国产美国国产综合一区二区| 136国产福利精品导航网址| 一区二区av| 一区二区三区在线免费观看| 亚洲精品久久久久久一区二区| 欧美高清视频| 久久精品视频va| 国产日韩欧美在线看| 日韩一级黄色大片| 日韩午夜一区| 欧美不卡视频一区发布| 久久亚洲综合色| 韩日午夜在线资源一区二区| 亚洲免费影视| 亚洲综合色在线| 国产精品青草综合久久久久99| 亚洲国产小视频| 99视频一区二区| 欧美日韩免费一区二区三区| 日韩一区二区免费高清| 这里是久久伊人| 国产日产欧美一区| 欧美一区在线直播| 亚洲第一毛片| 亚洲桃色在线一区| 国产精品影片在线观看| 欧美一级在线视频| 欧美激情一区二区三级高清视频|