1. 程式人生 > >網路程式設計——7. 優雅地斷開套接字連線

網路程式設計——7. 優雅地斷開套接字連線

之前的方法不夠優雅是因為,我們直接呼叫了close或closesocket函式單方面斷開連線。

7.1 基於TCP的半關閉

TCP中的斷開連線過程比建立連線過程更重要,因為連線過程一般不會出現變數,但斷開過程有可能發生預想不到的結果。

單方面斷開連線帶來的問題

假如兩臺主機正在雙向通訊。當主機A傳送完最後的資料後,呼叫close函式斷開了連線,之後主機A再也無法接收主機B的傳輸資料。 斷開一部分連線指的是可以傳輸資料但無法接收,或者可以接收資料但無法傳輸

套接字和流

把套接字建立後可進行資料交換的狀態看做是一種流。 為了進行雙向通訊,需要2個流。 其中一個主機的輸入流與另一個主機的輸出流相連,而輸出流則與另一主機的輸入流相連。 close函式將同時斷開這兩個流。 在這裡插入圖片描述

針對優雅斷開的shutdown函式

shutdown函式用來關閉其中的一個流

  • SHUT_RD:斷開輸入流,套接字無法接收資料。即使輸入緩衝收到資料也會抹去,而且無法呼叫輸入相關的函式
  • SHUT_WR:斷開輸出流,套接字無法傳輸資料。但如果輸出緩衝還留有未傳輸的資料,則將傳遞至目標主機。
  • SHUT_RDWR:同時中斷IO流。 在這裡插入圖片描述

為何需要半關閉