【網路程式設計】TCPIP-6-TCP的半關閉
阿新 • • 發佈:2021-08-23
目錄
前言
說明:
- 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,然後丟棄。
- 關閉輸出流後,輸出緩衝區的資料依舊能傳送到目的端。
參考
- 《TCP/IP網路程式設計》
- 李柱明部落格-TCP/IP TCP詳細筆記
- github 阿婆主