socket close()和shutdown()區(qū)別
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
shutdown() doesn''t actually close the file descriptor—it just changes its usability. To free a socket descriptor, you need to use close().
以下均基于單進(jìn)程socket。
通過參數(shù)設(shè)置不同,調(diào)用close會出現(xiàn)如下A,B兩種情況: A. 向客戶端發(fā)送一個RST報(bào)文,丟棄本地緩沖區(qū)的未讀數(shù)據(jù),關(guān)閉socket并釋放相關(guān)資源,此種方式為強(qiáng)制關(guān)閉。(l_onoff為非0,l_linger為0,) B. 向客戶端發(fā)送一個FIN報(bào)文,收到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及ACK報(bào)文均由操作系統(tǒng)自動完成發(fā)送接收)
server發(fā)送RST報(bào)文后,并不等待從client端接收任何ack響應(yīng),直接關(guān)閉socket。而client端收到RST報(bào)文后,也不會產(chǎn)生任何響應(yīng)。client端收到RST報(bào)文后,程序行為如下:
通過read write函數(shù)出錯返回后,獲取errno來確定對端是否發(fā)送RST信號。
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報(bào)文的情況下,client端的任何read write都是毫無意義的。 該文章在 2017/4/14 14:28:33 編輯過
|
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |