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

yehao's Blog

SOCKET CLOSE_WAIT狀態(tài)的說明

CLOSE_WAIT出現(xiàn)的原因: 就是某一方在網絡連接斷開后,對等方沒有檢測到這個錯誤(對方斷開)而沒有調用 closesocket,導致了這個狀態(tài)的出現(xiàn);
 
斷開連接的時候:
      當發(fā)起主動關閉的左邊這方發(fā)送一個FIN過去后,右邊被動關閉的這方要回應一個ACK,這個ACK是TCP回應的(同時TCP向上層應用程序提交一個ERROR,導致上面的SOCKET的send或者recv返回SOCKET_ERROR),而不是應用程序發(fā)送的,此時,被動關閉的一方就處于CLOSE_WAIT狀態(tài)了。如果此時被動關閉的這一方不再繼續(xù)調用closesocket,那么他就不會發(fā)送接下來的FIN,導致自己老是處于CLOSE_WAIT。只有被動關閉的這一方調用了closesocket,才會發(fā)送一個FIN給主動關閉的這一方,同時也使得自己的狀態(tài)變遷為LAST_ACK,待接收到主動關閉方發(fā)送的ACK后,才會將SOCKET置為CLOSED。
+ expand sourceview plaincopy to clipboardprint?
int nRet = recv(sockConnected, szRecvBuffer,sizeof(szRecvBuffer),0);   
///   
/// 當對方調用closesocket的時候,我的程序正在recv,  
/// 這時候有可能對方發(fā)送的FIN包我沒有收到,而是由TCP代回了一個ACK包,  
/// 所以我這邊程序進入CLOSE_WAIT狀態(tài)。   
/// 所以建議在這里判斷是否已出錯,是就主動closesocket。   
/// 因為前面已經設置了recv超時時間為30秒,那么如果真的是超時了,   
/// 這里收到的錯誤應該是WSAETIMEDOUT,這種情況下也可以關閉連接的   
if (nRet == SOCKET_ERROR)   
{   
   TRACE_INFO(_T("=用recv接收發(fā)生Socket錯誤="));   
   closesocket(sockConnected);   
   return FALSE;  
}  
int nRet = recv(sockConnected, szRecvBuffer,sizeof(szRecvBuffer),0);
///
/// 當對方調用closesocket的時候,我的程序正在recv,
/// 這時候有可能對方發(fā)送的FIN包我沒有收到,而是由TCP代回了一個ACK包,
/// 所以我這邊程序進入CLOSE_WAIT狀態(tài)。
/// 所以建議在這里判斷是否已出錯,是就主動closesocket。
/// 因為前面已經設置了recv超時時間為30秒,那么如果真的是超時了,
/// 這里收到的錯誤應該是WSAETIMEDOUT,這種情況下也可以關閉連接的
if (nRet == SOCKET_ERROR)
{
   TRACE_INFO(_T("=用recv接收發(fā)生Socket錯誤="));
   closesocket(sockConnected);
   return FALSE;
}
  
檢測到SOCKET_ORROR 則主動調用closesocket() 關閉套接字;
***************************************************************
首先我們知道,如果我們的Client程序處于CLOSE_WAIT狀態(tài)的話,說明套接字是被動關閉的!
因為如果是Server端主動斷掉當前連接的話,那么雙方關閉這個TCP連接共需要四個packet:
       Server ---> FIN ---> Client
       Server <--- ACK <--- Client
    這時候Server端處于FIN_WAIT_2狀態(tài);而我們的程序處于CLOSE_WAIT狀態(tài)。
       Server <--- FIN <--- Client
這時Client發(fā)送FIN給Server,Client就置為LAST_ACK狀態(tài)。
        Server ---> ACK ---> Client
Server回應了ACK,那么Client的套接字才會真正置為CLOSED狀態(tài)。


我們的程序處于CLOSE_WAIT狀態(tài),而不是LAST_ACK狀態(tài),說明還沒有發(fā)FIN給Server,那么可能是在關閉連接之前還有許多數(shù)據(jù)要發(fā)送或者其他事要做,導致沒有發(fā)這個FIN packet。
原因知道了,那么為什么不發(fā)FIN包呢,難道會在關閉己方連接前有那么多事情要做嗎?
還有一個問題,為什么有數(shù)千個連接都處于這個狀態(tài)呢?難道那段時間內,服務器端總是主動拆除我們的連接嗎?
不管怎么樣,我們必須防止類似情況再度發(fā)生!
首先,我們要防止不斷開辟新的端口,這可以通過設置SO_REUSEADDR套接字選項做到:
重用本地地址和端口
以前我總是一個端口不行,就換一個新的使用,所以導致讓數(shù)千個端口進入CLOSE_WAIT狀態(tài)。如果下次還發(fā)生這種尷尬狀況,我希望加一個限定,只是當前這個端口處于CLOSE_WAIT狀態(tài)!
在調用
sockConnected = socket(AF_INET, SOCK_STREAM, 0);
之后,我們要設置該套接字的選項來重用:
/// 允許重用本地地址和端口:
/// 這樣的好處是,即使socket斷了,調用前面的socket函數(shù)也不會占用另一個,而是始終就是一個端口
/// 這樣防止socket始終連接不上,那么按照原來的做法,會不斷地換端口。
int nREUSEADDR = 1;
setsockopt(sockConnected,
              SOL_SOCKET,
              SO_REUSEADDR,
              (const char*)&nREUSEADDR,
              sizeof(int));

教科書上是這么說的:這樣,假如服務器關閉或者退出,造成本地地址和端口都處于TIME_WAIT狀態(tài),那么SO_REUSEADDR就顯得非常有用。
也許我們無法避免被凍結在CLOSE_WAIT狀態(tài)永遠不出現(xiàn),但起碼可以保證不會占用新的端口。
其次,我們要設置SO_LINGER套接字選項:(相關介紹可參考:SO_LINGER 選項設置)
從容關閉還是強行關閉?
LINGER是“拖延”的意思。
默認情況下(Win2k),SO_DONTLINGER套接字選項的是1;SO_LINGER選項是,linger為{l_onoff:0,l_linger:0}。
如果在發(fā)送數(shù)據(jù)的過程中(send()沒有完成,還有數(shù)據(jù)沒發(fā)送)而調用了closesocket(),以前我們一般采取的措施是“從容關閉”:
因為在退出服務或者每次重新建立socket之前,我都會先調用
/// 先將雙向的通訊關閉
     shutdown(sockConnected, SD_BOTH);
     /// 安全起見,每次建立Socket連接前,先把這個舊連接關閉
closesocket(sockConnected);
我們這次要這么做:
設置SO_LINGER為零(亦即linger結構中的l_onoff域設為非零,但l_linger為0),便不用擔心closesocket調用進入“鎖定”狀態(tài)(等待完成),不論是否有排隊數(shù)據(jù)未發(fā)送或未被確認。這種關閉方式稱為“強行關閉”,因為套接字的虛電路立即被復位,尚未發(fā)出的所有數(shù)據(jù)都會丟失。在遠端的recv()調用都會失敗,并返回WSAECONNRESET錯誤。
在connect成功建立連接之后設置該選項:
linger m_sLinger;
m_sLinger.l_onoff = 1; // (在closesocket()調用,但是還有數(shù)據(jù)沒發(fā)送完畢的時候容許逗留)
m_sLinger.l_linger = 0; // (容許逗留的時間為0秒)
setsockopt(sockConnected,
         SOL_SOCKET,
         SO_LINGER,
         (const char*)&m_sLinger,
         sizeof(linger));

總結
也許我們避免不了CLOSE_WAIT狀態(tài)凍結的再次出現(xiàn),但我們會使影響降到最小,希望那個重用套接字選項能夠使得下一次重新建立連接時可以把CLOSE_WAIT狀態(tài)踢掉。


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/factor2000/archive/2009/02/23/3929197.aspx

posted on 2011-05-01 15:55 厚積薄發(fā) 閱讀(745) 評論(0)  編輯 收藏 引用 所屬分類: 網絡編程

導航

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統(tǒng)計

常用鏈接

留言簿

隨筆分類

文章分類

文章檔案

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美96在线丨欧| 麻豆9191精品国产| 亚洲综合久久久久| 亚洲片国产一区一级在线观看| 欧美无乱码久久久免费午夜一区| 欧美在线你懂的| 午夜精品久久久久久久99热浪潮| 99视频+国产日韩欧美| 亚洲开发第一视频在线播放| 欧美激情精品久久久久久黑人| 欧美激情精品久久久久久久变态| 久久欧美中文字幕| 免费影视亚洲| 一区二区三区欧美视频| 亚洲一区不卡| 久久久午夜电影| 欧美精品一级| 国产日韩久久| 99re亚洲国产精品| 亚洲女同精品视频| 久久视频精品在线| 亚洲成人在线视频播放| 一本色道久久88综合日韩精品| 亚洲永久字幕| 国产精品jizz在线观看美国 | 久久久久久欧美| 亚洲国产成人午夜在线一区 | 亚洲福利视频网| 小嫩嫩精品导航| 国产精品v欧美精品v日本精品动漫 | 亚洲午夜在线| 亚洲精品在线一区二区| 亚洲国产精品t66y| 欧美.日韩.国产.一区.二区| 91久久中文字幕| 亚洲色图自拍| 久久婷婷激情| 亚洲三级电影在线观看| 欧美日韩在线直播| 欧美二区乱c少妇| 麻豆精品一区二区av白丝在线| 妖精成人www高清在线观看| 欧美激情中文字幕一区二区| 一区二区三区鲁丝不卡| 亚洲午夜一区二区三区| 亚洲午夜精品网| 国产精品高潮呻吟久久| 午夜亚洲视频| 久久久久国产一区二区三区| 亚洲一区二区动漫| 久久精品国产视频| 亚洲精品一区二区三区福利| 午夜精品电影| 一本到高清视频免费精品| 国内久久视频| 麻豆91精品| 久久精品国产999大香线蕉| 欧美高清不卡| 国产精品久久久久久久午夜| 国产精品推荐精品| 日韩一级裸体免费视频| 亚洲国产经典视频| 国产精品无人区| 麻豆成人精品| 欧美视频一区在线| 欧美精品色综合| 免费成人在线视频网站| 毛片基地黄久久久久久天堂| 欧美精品日韩精品| 亚洲精品综合| 亚洲国产成人精品视频| 欧美在线视频二区| 精品动漫av| 亚洲国产日韩欧美| 国产精品成人aaaaa网站| 亚洲少妇在线| 久久精品99| 99精品视频免费| 欧美中文字幕精品| 欧美亚洲免费电影| 欧美性片在线观看| 欧美大片国产精品| 怡红院精品视频| 蜜臀va亚洲va欧美va天堂| 久久久亚洲国产天美传媒修理工 | 久久久人成影片一区二区三区观看| 午夜精品短视频| 国产亚洲欧美日韩日本| 午夜在线成人av| 欧美性大战久久久久| 欧美一区二区三区视频免费播放| 欧美大片一区二区| 99视频日韩| 国产视频一区在线观看| 免费不卡在线观看av| 99国内精品| 久久躁日日躁aaaaxxxx| 亚洲乱码国产乱码精品精天堂 | 久久精品免费播放| 国产亚洲综合性久久久影院| 久久在线91| 欧美一区视频在线| 亚洲欧洲日韩在线| 久久久精品2019中文字幕神马| 亚洲国产精品黑人久久久| 国产精品爱久久久久久久| 久久久噜噜噜久久中文字幕色伊伊 | 国产日韩在线视频| 欧美激情aaaa| 亚洲欧洲一区二区三区| 国产一区 二区 三区一级| 欧美成人午夜激情| 久久亚洲高清| 久久精品99久久香蕉国产色戒| 一本色道久久88综合亚洲精品ⅰ| 亚洲电影观看| 欧美激情一区二区三区在线视频观看 | 亚洲人成免费| 99精品视频免费| 9i看片成人免费高清| 欧美一激情一区二区三区| 亚洲欧洲一区二区三区在线观看| 久久三级视频| 亚洲国产精品ⅴa在线观看 | 亚洲观看高清完整版在线观看| 国产欧美日韩一级| 激情文学综合丁香| 亚洲精品一区二区网址| 国产精品99久久久久久久vr| 亚洲砖区区免费| 裸体一区二区三区| 亚洲欧洲中文日韩久久av乱码| 亚洲精品在线电影| 午夜在线a亚洲v天堂网2018| 久久爱www久久做| 欧美成人免费全部观看天天性色| 欧美激情中文不卡| 国产伦精品一区二区三区在线观看| 国产一区二区三区高清在线观看| 在线观看视频欧美| 亚洲欧美综合v| 欧美岛国在线观看| 亚洲欧美一区二区在线观看| 麻豆精品传媒视频| 国产亚洲欧美一区二区| 在线视频精品一| 亚洲黄色在线| 久久久国产精品亚洲一区 | 亚洲日本aⅴ片在线观看香蕉| 亚洲欧美激情视频| 欧美视频日韩视频| 亚洲人成在线影院| 欧美激情综合色| 久久久久这里只有精品| 国产综合激情| 久久久夜精品| 久久精品五月| 91久久久国产精品| 亚洲高清免费| 欧美日韩免费观看一区二区三区| 久久激情中文| 激情六月综合| 欧美 日韩 国产精品免费观看| 久久成人免费网| 国产一区观看| 欧美激情一区二区久久久| 欧美大片网址| 亚洲欧美综合| 久久精品一区二区三区四区 | 欧美一站二站| 国产婷婷色一区二区三区四区| 欧美中文字幕精品| 免费在线看成人av| 欧美一区2区三区4区公司二百| 久久精品夜色噜噜亚洲a∨| 一本大道久久a久久精二百| 亚洲一级黄色| 99国产精品国产精品久久| 亚洲综合色网站| 一区二区日韩精品| 欧美在线视频不卡| 亚洲欧美亚洲| 欧美日韩在线一二三| 欧美成人黄色小视频| 国产日本欧美一区二区三区在线| 亚洲黄页一区| 亚洲欧洲午夜| 牛夜精品久久久久久久99黑人| 香蕉精品999视频一区二区| 欧美日韩不卡一区| 亚洲国产高清aⅴ视频| 在线观看免费视频综合| 欧美伊久线香蕉线新在线| 久久久久久综合网天天| 国产精品揄拍500视频| 亚洲男女自偷自拍图片另类| 在线视频日韩精品| 国产精品久久久久久久免费软件| 夜夜夜久久久| 性欧美18~19sex高清播放|