socket close()和shutdown()區(qū)別

shutdown() doesn't actually close the file descriptor—it just changes its usability. To free a socket descriptor, you need to use close().

  • shutdown是一種優(yōu)雅地單方向或者雙方向關(guān)閉socket的方法。 而close則立即雙方向強(qiáng)制關(guān)閉socket并釋放相關(guān)資源。

  • 如果有多個進(jìn)程共享一個socket道媚,shutdown影響所有進(jìn)程膝但,而close只影響本進(jìn)程。

以下均基于單進(jìn)程socket镰吆。

服務(wù)端調(diào)用shutdown()

  • server調(diào)用shutdown()芹助,此時任何后續(xù)的send,recv都是無效的(根據(jù)關(guān)閉發(fā)送還是關(guān)閉接收有所不同)挟纱。shutdown本身并不影響底層羞酗,也就是說,此前發(fā)出的異步send/recv不會返回紊服。其次檀轨,在所有已發(fā)送的包被client確認(rèn)后,server會發(fā)送FIN包給client欺嗤,開始TCP四次揮手過程参萄。

  • 注意不管是關(guān)閉發(fā)送還是關(guān)閉接收,server端均向client端發(fā)送FIN報文煎饼。client 端收到FIN報文后讹挎,并不知道server端以何種方式shutdown,甚至不知道server端是shutdown還是close吆玖。

  • client端收到FIN報文之后筒溃,詳見下文敘述......

服務(wù)端調(diào)用close()

通過參數(shù)設(shè)置不同,調(diào)用close會出現(xiàn)如下A沾乘,B兩種情況:

A. 向客戶端發(fā)送一個RST報文怜奖,丟棄本地緩沖區(qū)的未讀數(shù)據(jù),關(guān)閉socket并釋放相關(guān)資源翅阵,此種方式為強(qiáng)制關(guān)閉歪玲。(l_onoff為非0,l_linger為0怎顾,)

B. 向客戶端發(fā)送一個FIN報文读慎,收到client端FIN ACK后,進(jìn)入了FIN_WAIT_2階段槐雾,可參考TCP四次揮手過程夭委,此種方式為優(yōu)雅關(guān)閉。如果在l_linger的時間內(nèi)仍未完成四次揮手募强,則強(qiáng)制關(guān)閉株灸。( l_onoff 為非0,l_linger為非0)

FIN與RST

  • 若server端發(fā)送FIN報文后沒有收到client端的FIN ACK擎值,會兩次重傳FIN報文慌烧,若一直收不到client端的FIN ACK,則會給client端發(fā)送RST信號鸠儿,關(guān)閉socket并釋放資源屹蚊。(不同系統(tǒng)實現(xiàn)可能會不同)

  • client收到FIN信號后厕氨,再調(diào)用read函數(shù)會返回0。因為FIN的接收汹粤,表明client端以后再無數(shù)據(jù)可以接收命斧,對方發(fā)來FIN,表明對方不在發(fā)送數(shù)據(jù)了嘱兼。

(注意所有FIN及ACK報文均由操作系統(tǒng)自動完成發(fā)送接收)

  • client收到FIN后国葬,會發(fā)送應(yīng)答ack報文,表明收到server的FIN報文芹壕,server收到ack報文之后汇四,就進(jìn)入了FIN_WAIT_2階段。

  • 根據(jù)tcp協(xié)議踢涌,向一個 FIN_WAIT2 狀態(tài)的 TCP寫入數(shù)據(jù)是沒有問題的通孽,所以此時client可以調(diào)用write函數(shù),寫入到發(fā)送緩沖區(qū)睁壁,并由tcp連接利虫,發(fā)送到server的接收緩沖區(qū)。由于server端已經(jīng)關(guān)閉了socket堡僻,所以此時的server接收緩沖區(qū)的內(nèi)容都被拋棄,同時server端返回RST給客戶端疫剃。

  • client端如何知道已經(jīng)接收到RST報文钉疫?

server發(fā)送RST報文后,并不等待從client端接收任何ack響應(yīng)巢价,直接關(guān)閉socket牲阁。而client端收到RST報文后,也不會產(chǎn)生任何響應(yīng)壤躲。client端收到RST報文后城菊,程序行為如下:

  1. 阻塞模型下,內(nèi)核無法主動通知應(yīng)用層出錯碉克,只有應(yīng)用層主動調(diào)用read()或者write()這樣的IO系統(tǒng)調(diào)用時凌唬,內(nèi)核才會利用出錯來通知應(yīng)用層對端已經(jīng)發(fā)送RST報文。
  2. 非阻塞模型下漏麦,select或者epoll會返回sockfd可讀,應(yīng)用層對其進(jìn)行讀取時客税,read()會報RST錯誤。

通過read write函數(shù)出錯返回后撕贞,獲取errno來確定對端是否發(fā)送RST信號更耻。

  • client收到RST報文后應(yīng)如何處理?

client端收到RST信號后捏膨,如果調(diào)用read函數(shù)讀取秧均,則會返回RST錯誤食侮。在已經(jīng)產(chǎn)生RST錯誤的情況下,繼續(xù)調(diào)用write目胡,則會發(fā)生epipe錯誤锯七。此時內(nèi)核將向客戶進(jìn)程發(fā)送 SIGPIPE 信號,該信號默認(rèn)會使進(jìn)程終止讶隐,通常程序會異常退出(未處理SIGPIPE信號的情況下)起胰。

在收到server發(fā)送RST報文的情況下,client端的任何read write都是毫無意義的巫延。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末效五,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子炉峰,更是在濱河造成了極大的恐慌畏妖,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疼阔,死亡現(xiàn)場離奇詭異戒劫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)婆廊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門迅细,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人淘邻,你說我怎么就攤上這事茵典。” “怎么了宾舅?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵统阿,是天一觀的道長。 經(jīng)常有香客問我筹我,道長扶平,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任蔬蕊,我火速辦了婚禮结澄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘岸夯。我一直安慰自己概而,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布囱修。 她就那樣靜靜地躺著赎瑰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪破镰。 梳的紋絲不亂的頭發(fā)上餐曼,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天压储,我揣著相機(jī)與錄音,去河邊找鬼源譬。 笑死集惋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的踩娘。 我是一名探鬼主播刮刑,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼养渴!你這毒婦竟也來了雷绢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤理卑,失蹤者是張志新(化名)和其女友劉穎翘紊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體藐唠,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡帆疟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了宇立。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踪宠。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖妈嘹,靈堂內(nèi)的尸體忽然破棺而出殴蓬,到底是詐尸還是另有隱情,我是刑警寧澤蟋滴,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站痘绎,受9級特大地震影響津函,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜孤页,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一尔苦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧行施,春花似錦允坚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鲜结,卻和暖如春展运,著一層夾襖步出監(jiān)牢的瞬間活逆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工拗胜, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留蔗候,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓埂软,卻偏偏與公主長得像锈遥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子勘畔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容