socket shutdown和close的區別

2022-05-19 14:05:55 字數 1116 閱讀 3008

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

以下均基於單程序socket。

服務端呼叫shutdown()

服務端呼叫close()

通過引數設定不同,呼叫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與rst

(注意所有fin及ack報文均由作業系統自動完成傳送接收)

server傳送rst報文後,並不等待從client端接收任何ack響應,直接關閉socket。而client端收到rst報文後,也不會產生任何響應。client端收到rst報文後,程式行為如下:

阻塞模型下,核心無法主動通知應用層出錯,只有應用層主動呼叫read()或者write()這樣的io系統呼叫時,核心才會利用出錯來通知應用層對端已經傳送rst報文。

非阻塞模型下,select或者epoll會返回sockfd可讀,應用層對其進行讀取時,read()會報rst錯誤。

通過read write函式出錯返回後,獲取errno來確定對端是否傳送rst訊號。

client端收到rst訊號後,如果呼叫read函式讀取,則會返回rst錯誤。在已經產生rst錯誤的情況下,繼續呼叫write,則會發生epipe錯誤。此時核心將向客戶程序傳送 sigpipe 訊號,該訊號缺省會使程序終止,通常程式會異常退出(未處理sigpipe訊號的情況下)。

在收到server傳送rst報文的情況下,client端的任何read write都是毫無意義的。

和 區別和聯絡, 和 區別和聯絡

和 區別和聯絡,和 區別和聯絡,實際專案中,什麼情況用哪種?首先,和 的聯絡 共同點 和 都可以用作 邏輯與 運算子,都是雙目運算子。具體要看使用時的具體條件來決定。無論使用哪種運算子,對最終的運算結果都沒有影響。情況1 當上述的運算元是boolean型別變數時,和 都可以用作邏輯與運算子。情況2 ...

rpx和樣式和class和flex

5 style 靜態的樣式統一寫到 class 中。style 接收動態的樣式,在執行時會進行解析,請盡量避免將靜態的樣式寫進 style 中,以免影響渲染速度。例 6 class 用於指定樣式規則,其屬性值是樣式規則中類選擇器名 樣式類名 的集合,樣式類名不需要帶上.樣式類名之間用空格分隔。關於f...

if和switch和for語句

if和switch很像。具體什麼場景下,應用那個語句呢?如果判斷的具體數值不多,而是符合byte,short,int,char,字串。這五種型別。雖然兩個語句都可以使用,建議使用switch語句,因為效率稍高。其他情況,對區間判斷,對結果為boolean型別判斷,使用if,if的使用範圍更廣。whi...