Socket
ssize_tread(intfd,void*buf,size_tcount);ssize_twrite(intfd,constvoid*buf,size_tcount);
read()
read 函數是負責從 fd 中讀取內容。
當讀成功時,read 返回實際所讀的字節數。
如果返回的值是 0 表示已經讀到文件的結束了,小于 0 表示出現了錯誤。
如果錯誤為 EINTR 說明讀是由中斷引起的;如果是 ECONNREST 表示網絡連接出了問題。
write()
write 函數將 buf 中的 nbytes 字節內容寫入文件描述符 fd。
成功時返回寫的字節數。失敗時返回 -1,并設置 errno 變量。
在網絡程序中,當我們向套接字文件描述符寫時有倆種可能。
(1)write 的返回值大于 0,表示寫了部分或者是全部的數據。
(2)返回的值小于 0,此時出現了錯誤。
如果錯誤為 EINTR 表示在寫的時候出現了中斷錯誤;如果為 EPIPE 表示網絡連接出現了問題(對方已經關閉了連接)。
Socket 中 TCP 的三次握手建立連接
我們知道 TCP 建立連接要進行 “三次握手”,即交換三個分組。大致流程如下:
客戶端向服務器發送一個 SYN J
服務器向客戶端響應一個 SYN K,并對 SYN J 進行確認 ACK J+1
客戶端再想服務器發一個確認 ACK K+1
只有就完了三次握手,但是這個三次握手發生在 Socket 的那幾個函數中呢?請看下圖:
從圖中可以看出:
(1)當客戶端調用 connect 時,觸發了連接請求,向服務器發送了 SYN J 包,這時 connect 進入阻塞狀態;
(2)服務器監聽到連接請求,即收到 SYN J 包,調用 accept 函數接收請求向客戶端發送 SYN K ,ACK J+1,這時 accept 進入阻塞狀態;
(3)客戶端收到服務器的 SYN K ,ACK J+1 之后,這時 connect 返回,并對 SYN K 進行確認;
(4)服務器收到 ACK K+1 時,accept 返回,至此三次握手完畢,連接建立。
Socket 中 TCP 的四次握手釋放連接
上面介紹了 socket 中 TCP 的三次握手建立過程,及其涉及的 socket 函數。現在我們介紹 socket 中的四次握手釋放連接的過程,請看下圖:
圖示過程如下:
某個應用進程首先調用 close 主動關閉連接,這時 TCP 發送一個 FIN M;
另一端接收到 FIN M 之后,執行被動關閉,對這個 FIN 進行確認。它的接收也作為文件結束符傳遞給應用進程,因為 FIN 的接收意味著應用進程在相應的連接上再也接收不到額外數據;
一段時間之后,接收到文件結束符的應用進程調用 close 關閉它的 socket。這導致它的 TCP 也發送一個 FIN N;
接收到這個 FIN 的源發送端 TCP 對它進行確認。
這樣每個方向上都有一個 FIN 和 ACK。
————
今天的分享就到這里了,大家要好好學C++喲~
責任編輯:haq
-
Linux
+關注
關注
87文章
11345瀏覽量
210386 -
編程
+關注
關注
88文章
3637瀏覽量
93981 -
C++
+關注
關注
22文章
2114瀏覽量
73854
原文標題:C++基礎語法梳理:網絡編程丨Socket
文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論