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().
以下均基于單進程socket。
通過參數(shù)設置不同,調用close會出現(xiàn)如下A,B兩種情況: A. 向客戶端發(fā)送一個RST報文,丟棄本地緩沖區(qū)的未讀數(shù)據(jù),關閉socket并釋放相關資源,此種方式為強制關閉。(l_onoff為非0,l_linger為0,) B. 向客戶端發(fā)送一個FIN報文,收到client端FIN ACK后,進入了FIN_WAIT_2階段,可參考TCP四次揮手過程,此種方式為優(yōu)雅關閉。如果在l_linger的時間內仍未完成四次揮手,則強制關閉。( l_onoff 為非0,l_linger為非0)
(注意所有FIN及ACK報文均由操作系統(tǒng)自動完成發(fā)送接收)
server發(fā)送RST報文后,并不等待從client端接收任何ack響應,直接關閉socket。而client端收到RST報文后,也不會產生任何響應。client端收到RST報文后,程序行為如下:
通過read write函數(shù)出錯返回后,獲取errno來確定對端是否發(fā)送RST信號。
client端收到RST信號后,如果調用read函數(shù)讀取,則會返回RST錯誤。在已經(jīng)產生RST錯誤的情況下,繼續(xù)調用write,則會發(fā)生epipe錯誤。此時內核將向客戶進程發(fā)送 SIGPIPE 信號,該信號默認會使進程終止,通常程序會異常退出(未處理SIGPIPE信號的情況下)。 在收到server發(fā)送RST報文的情況下,client端的任何read write都是毫無意義的。 該文章在 2017/4/14 14:28:33 編輯過
|
關鍵字查詢
相關文章
正在查詢... |