1. 程式人生 > 其它 >【網路程式設計】TCPIP-6-TCP的半關閉

【網路程式設計】TCPIP-6-TCP的半關閉

目錄

前言

說明:

  • demo 基於 Linux。

6. TCP 的半關閉

關閉套接字API有:

  • close():單方面全斷開。
  • shutdown():可選斷開某個流。

6.1 何為半關閉

如圖分為輸入流和輸出流兩個流,關閉其一就是半關閉。

6.2 半關閉解決的用途

單方面斷開可能帶來的問題如圖:

主機A發完了就斷開了,萬一主機B還有資料恢復咋搞。
那就採用半關閉,主機A發完就關閉傳送流,保留接收流。

6.3 相關函式

/*	sock: 需要斷開套接字檔案描述符
	howto: 傳遞斷開方式資訊
	成功時返回 0 ,失敗時返回 -1
*/
#include <sys/socket.h>
int shutdown(int sock, int howto);

引數howto

  • SHUT_RD : 斷開輸入流。套接字無法接收,同時,緩衝區的資料也被清空
  • SHUT_WR : 斷開輸出流。套接字無法傳送,但是和 close() 一樣,緩衝區的資料依舊能傳送出去
  • SHUT_RDWR : 同時斷開 I/O 流。同時關閉 I/O 流。

小知識

  • 呼叫 close() 後:
    • 輸入緩衝區的資料被丟棄。
    • 輸出緩衝區的資料依舊能傳送到目的端。
  • 呼叫 shutdown() 後:
    • 關閉輸入流後,輸入緩衝區的資料被丟棄。後面新來的資料流,會對其進行 ACK,然後丟棄。
    • 關閉輸出流後,輸出緩衝區的資料依舊能傳送到目的端。

參考