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

Prayer

在一般中尋求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

CLOSE_WAIT狀態(tài)的生成原因[轉(zhuǎn)]

Posted on 2009-04-01 19:29 Prayer 閱讀(817) 評論(0)  編輯 收藏 引用 所屬分類: SOCKET

CLOSE_WAIT狀態(tài)的生成原因
首先我們知道,如果我們的Client程序處于CLOSE_WAIT狀態(tài)的話,說明套接字是被動關(guān)閉的!

因為如果是Server端主動斷掉當前連接的話,那么雙方關(guān)閉這個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回應(yīng)了ACK,那么Client的套接字才會真正置為CLOSED狀態(tài)。

 

我們的程序處于CLOSE_WAIT狀態(tài),而不是LAST_ACK狀態(tài),說明還沒有發(fā)FIN給Server,那么可能是在關(guān)閉連接之前還有許多數(shù)據(jù)要發(fā)送或者其他事要做,導致沒有發(fā)這個FIN packet。

 

原因知道了,那么為什么不發(fā)FIN包呢,難道會在關(guān)閉己方連接前有那么多事情要做嗎?

elssann舉例說,當對方調(diào)用closesocket的時候,我的程序正在調(diào)用recv中,這時候有可能對方發(fā)送的FIN包我沒有收到,而是由TCP代回了一個ACK包,所以我這邊套接字進入CLOSE_WAIT狀態(tài)。

所以他建議在這里判斷recv函數(shù)的返回值是否已出錯,是的話就主動closesocket,這樣防止沒有接收到FIN包。

因為前面我們已經(jīng)設(shè)置了recv超時時間為30秒,那么如果真的是超時了,這里收到的錯誤應(yīng)該是WSAETIMEDOUT,這種情況下也可以主動關(guān)閉連接的。

 

還有一個問題,為什么有數(shù)千個連接都處于這個狀態(tài)呢?難道那段時間內(nèi),服務(wù)器端總是主動拆除我們的連接嗎?

 

不管怎么樣,我們必須防止類似情況再度發(fā)生!

首先,我們要保證原來的端口可以被重用,這可以通過設(shè)置SO_REUSEADDR套接字選項做到:


重用本地地址和端口
以前我總是一個端口不行,就換一個新的使用,所以導致讓數(shù)千個端口進入CLOSE_WAIT狀態(tài)。如果下次還發(fā)生這種尷尬狀況,我希望加一個限定,只是當前這個端口處于CLOSE_WAIT狀態(tài)!

在調(diào)用

sockConnected = socket(AF_INET, SOCK_STREAM, 0);

之后,我們要設(shè)置該套接字的選項來重用:

/// 允許重用本地地址和端口:

/// 這樣的好處是,即使socket斷了,調(diào)用前面的socket函數(shù)也不會占用另一個,而是始終就是一個端口

/// 這樣防止socket始終連接不上,那么按照原來的做法,會不斷地換端口。

int nREUSEADDR = 1;

setsockopt(sockConnected,

              SOL_SOCKET,

              SO_REUSEADDR,

              (const char*)&nREUSEADDR,

              sizeof(int));
 

教科書上是這么說的:這樣,假如服務(wù)器關(guān)閉或者退出,造成本地地址和端口都處于TIME_WAIT狀態(tài),那么SO_REUSEADDR就顯得非常有用。

也許我們無法避免被凍結(jié)在CLOSE_WAIT狀態(tài)永遠不出現(xiàn),但起碼可以保證不會占用新的端口。

其次,我們要設(shè)置SO_LINGER套接字選項:

從容關(guān)閉還是強行關(guān)閉?
LINGER是“拖延”的意思。

默認情況下(Win2k),SO_DONTLINGER套接字選項的是1;SO_LINGER選項是,linger為{l_onoff:0,l_linger:0}。

如果在發(fā)送數(shù)據(jù)的過程中(send()沒有完成,還有數(shù)據(jù)沒發(fā)送)而調(diào)用了closesocket(),以前我們一般采取的措施是“從容關(guān)閉”:

因為在退出服務(wù)或者每次重新建立socket之前,我都會先調(diào)用

/// 先將雙向的通訊關(guān)閉

     shutdown(sockConnected, SD_BOTH);

     /// 安全起見,每次建立Socket連接前,先把這個舊連接關(guān)閉

closesocket(sockConnected);

 

我們這次要這么做:

設(shè)置SO_LINGER為零(亦即linger結(jié)構(gòu)中的l_onoff域設(shè)為非零,但l_linger為0),便不用擔心closesocket調(diào)用進入“鎖定”狀態(tài)(等待完成),不論是否有排隊數(shù)據(jù)未發(fā)送或未被確認。這種關(guān)閉方式稱為“強行關(guān)閉”,因為套接字的虛電路立即被復位,尚未發(fā)出的所有數(shù)據(jù)都會丟失。在遠端的recv()調(diào)用都會失敗,并返回WSAECONNRESET錯誤。

在connect成功建立連接之后設(shè)置該選項:

linger m_sLinger;

m_sLinger.l_onoff = 1;  // (在closesocket()調(diào)用,但是還有數(shù)據(jù)沒發(fā)送完畢的時候容許逗留)

m_sLinger.l_linger = 0; // (容許逗留的時間為0秒)

setsockopt(sockConnected,

         SOL_SOCKET,

         SO_LINGER,

         (const char*)&m_sLinger,

         sizeof(linger));
 

 

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


我的意思是:當一方關(guān)閉連接后,另外一方?jīng)]有檢測到,就導致了CLOSE_WAIT的出現(xiàn),上次我的一個朋友也是這樣,他寫了一個客戶端和 APACHE連接,當APACHE把連接斷掉后,他沒檢測到,出現(xiàn)了CLOSE_WAIT,后來我叫他檢測了這個地方,他添加了調(diào)用 closesocket的代碼后,這個問題就消除了。
如果你在關(guān)閉連接前還是出現(xiàn)CLOSE_WAIT,建議你取消shutdown的調(diào)用,直接兩邊closesocket試試。


另外一個問題:

比如這樣的一個例子:
當客戶端登錄上服務(wù)器后,發(fā)送身份驗證的請求,服務(wù)器收到了數(shù)據(jù),對客戶端身份進行驗證,發(fā)現(xiàn)密碼錯誤,這時候服務(wù)器的一般做法應(yīng)該是先發(fā)送一個密碼錯誤的信息給客戶端,然后把連接斷掉。

如果把
m_sLinger.l_onoff = 1;
m_sLinger.l_linger = 0;
這樣設(shè)置后,很多情況下,客戶端根本就收不到密碼錯誤的消息,連接就被斷了。

 


出現(xiàn)CLOSE_WAIT的原因很簡單,就是某一方在網(wǎng)絡(luò)連接斷開后,沒有檢測到這個錯誤,沒有執(zhí)行closesocket,導致了這個狀態(tài)的實現(xiàn),這在TCP/IP協(xié)議的狀態(tài)變遷圖上可以清楚看到。同時和這個相對應(yīng)的還有一種叫TIME_WAIT的。

另外,把SOCKET的SO_LINGER設(shè)置為0秒拖延(也就是立即關(guān)閉)在很多時候是有害處的。
還有,把端口設(shè)置為可復用是一種不安全的網(wǎng)絡(luò)編程方法。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲午夜一区| 欧美一区二区高清在线观看| 久久婷婷麻豆| 亚洲国产第一页| 亚洲国产成人av在线| 麻豆精品传媒视频| 亚洲精品一区二区三区婷婷月 | 欧美日韩在线播放三区| 一本色道久久加勒比88综合 | 亚洲欧美久久| 欧美一级播放| 亚洲国产精品成人| 91久久国产综合久久蜜月精品 | 欧美在线一二三| 尹人成人综合网| 亚洲激情影视| 国产精品视频免费| 欧美成年人在线观看| 欧美欧美午夜aⅴ在线观看| 亚洲欧美激情精品一区二区| 午夜性色一区二区三区免费视频| 国自产拍偷拍福利精品免费一| 欧美国产激情| 国产精品国产亚洲精品看不卡15| 久久婷婷蜜乳一本欲蜜臀| 欧美多人爱爱视频网站| 亚洲永久在线观看| 久久精品国产久精国产思思| 亚洲精品久久久久久久久久久久久 | 一区二区三区免费观看| 亚洲欧美日韩国产综合| 亚洲黑丝在线| 亚洲欧美日韩电影| 一区二区高清视频在线观看| 久久激情视频久久| 亚洲一区www| 欧美wwwwww| 久久久免费av| 国产精品成人观看视频国产奇米| 欧美va亚洲va国产综合| 国产精品久久久久久模特| 亚洲第一成人在线| 好吊视频一区二区三区四区| 中文亚洲字幕| 一区二区三区www| 久久亚洲综合网| 久久久久国内| 国产精品网红福利| 日韩视频在线免费观看| 91久久精品国产| 久久久精品一区| 久久国产欧美精品| 国产精品一区二区三区久久久| 亚洲欧洲视频在线| 亚洲国产欧美一区| 久久九九国产| 久久嫩草精品久久久久| 国产精品有限公司| 亚洲一区二区三区免费在线观看 | 亚洲高清毛片| 久久久噜噜噜| 欧美 亚欧 日韩视频在线| 国产一区二区0| 欧美一级视频精品观看| 久久国产精品高清| 国产日韩一区二区三区在线| 亚洲一区二区三区视频播放| 亚洲视频一区二区| 欧美午夜片在线观看| 一本色道久久综合亚洲精品按摩| 99在线|亚洲一区二区| 欧美伦理一区二区| 亚洲免费黄色| 亚洲欧美日韩国产一区二区三区| 欧美日韩一区二区国产| 亚洲天堂成人在线视频| 欧美一区二区三区日韩视频| 国产精品永久在线| 久久九九精品99国产精品| 蜜臀久久99精品久久久久久9 | 国产午夜精品久久| 久久精品视频免费| 欧美激情a∨在线视频播放| 亚洲人妖在线| 欧美午夜无遮挡| 欧美一区2区视频在线观看 | 午夜精品视频在线| 国产亚洲在线| 欧美va亚洲va国产综合| 一区二区三区久久网| 久久精品人人做人人爽电影蜜月| 国内外成人免费激情在线视频网站| 久久精彩视频| 91久久香蕉国产日韩欧美9色| 亚洲天堂网站在线观看视频| 国产欧美日韩中文字幕在线| 久久久久国色av免费看影院| 亚洲人体影院| 欧美在线免费观看| 亚洲欧洲综合| 国产日韩在线播放| 欧美成人精品不卡视频在线观看| 日韩午夜精品| 蜜臀久久99精品久久久久久9| 宅男66日本亚洲欧美视频 | 麻豆乱码国产一区二区三区| 亚洲美女视频在线观看| 久久蜜桃资源一区二区老牛| 一本久久综合| 伊人成人网在线看| 国产精品国产自产拍高清av| 蜜臀91精品一区二区三区| 国产精品99久久久久久久久久久久| 久久一综合视频| 亚洲综合色激情五月| 在线观看一区二区精品视频| 国产精品日韩在线一区| 欧美激情精品久久久久久大尺度| 午夜在线播放视频欧美| 日韩午夜在线观看视频| 欧美电影免费| 美女福利精品视频| 久久国产视频网站| 亚洲综合色网站| 亚洲伦理在线观看| 亚洲丶国产丶欧美一区二区三区 | 欧美日韩国产黄| 麻豆精品在线视频| 久久精品成人欧美大片古装| 一本色道久久综合| 亚洲人成亚洲人成在线观看| 免费一级欧美在线大片| 久久久久国产成人精品亚洲午夜| 午夜精品www| 亚洲字幕在线观看| 亚洲视频精品| aaa亚洲精品一二三区| 91久久久久久| 91久久中文字幕| 亚洲激情视频在线播放| 亚洲国产高清一区二区三区| 精品白丝av| 有坂深雪在线一区| 在线免费观看一区二区三区| 国产一区亚洲| 影音先锋亚洲视频| 亚洲电影网站| 亚洲人成人一区二区在线观看| 在线观看中文字幕不卡| 亚洲电影毛片| 日韩视频免费观看高清完整版| 亚洲黄色有码视频| 亚洲美女黄网| 亚洲一区激情| 欧美制服丝袜第一页| 久久精品视频在线| 蜜乳av另类精品一区二区| 欧美成人综合一区| 亚洲精品久久久蜜桃| 一区二区三区国产在线| 亚洲欧美日本国产有色| 欧美在线播放| 欧美成人激情视频| 欧美视频在线观看| 国产日韩在线看片| 亚洲国产成人av好男人在线观看| 亚洲韩国一区二区三区| 一区二区三区四区在线| 午夜精品久久久久久久99热浪潮| 性欧美xxxx视频在线观看| 久久久91精品国产一区二区精品| 女同一区二区| 这里只有精品丝袜| 久久精品二区三区| 欧美伦理视频网站| 国产亚洲人成网站在线观看| 亚洲国产精品激情在线观看| 亚洲视频成人| 巨乳诱惑日韩免费av| 亚洲黄色毛片| 西瓜成人精品人成网站| 欧美sm视频| 国产日产高清欧美一区二区三区| 亚洲第一色在线| 午夜欧美精品久久久久久久| 欧美电影免费观看网站| 亚洲一区二区三区影院| 免费不卡在线视频| 国产欧美va欧美va香蕉在| 亚洲激情校园春色| 久久久91精品| 中日韩高清电影网| 免费国产自线拍一欧美视频| 国产精品乱码久久久久久| 亚洲国产精品欧美一二99| 欧美亚洲系列| 亚洲精品日韩在线观看| 久久久www成人免费无遮挡大片| 欧美日韩国产综合一区二区| 在线观看国产一区二区|