socket close()和shutdown()區別
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
shutdown() doesn''t actually close the file descriptor—it just changes its usability. To free a socket descriptor, you need to use close().
以下均基于單進程socket。
通過參數設置不同,調用close會出現如下A,B兩種情況: A. 向客戶端發送一個RST報文,丟棄本地緩沖區的未讀數據,關閉socket并釋放相關資源,此種方式為強制關閉。(l_onoff為非0,l_linger為0,) B. 向客戶端發送一個FIN報文,收到client端FIN ACK后,進入了FIN_WAIT_2階段,可參考TCP四次揮手過程,此種方式為優雅關閉。如果在l_linger的時間內仍未完成四次揮手,則強制關閉。( l_onoff 為非0,l_linger為非0)
(注意所有FIN及ACK報文均由操作系統自動完成發送接收)
server發送RST報文后,并不等待從client端接收任何ack響應,直接關閉socket。而client端收到RST報文后,也不會產生任何響應。client端收到RST報文后,程序行為如下:
通過read write函數出錯返回后,獲取errno來確定對端是否發送RST信號。
client端收到RST信號后,如果調用read函數讀取,則會返回RST錯誤。在已經產生RST錯誤的情況下,繼續調用write,則會發生epipe錯誤。此時內核將向客戶進程發送 SIGPIPE 信號,該信號默認會使進程終止,通常程序會異常退出(未處理SIGPIPE信號的情況下)。 在收到server發送RST報文的情況下,client端的任何read write都是毫無意義的。 該文章在 2017/4/14 14:28:33 編輯過
|
關鍵字查詢
相關文章
正在查詢... |