Socket
Socket 中的 read()、write() 函數(shù)
ssize_tread(intfd,void*buf,size_tcount);ssize_twrite(intfd,constvoid*buf,size_tcount);
read()
read 函數(shù)是負(fù)責(zé)從 fd 中讀取內(nèi)容。
當(dāng)讀成功時(shí),read 返回實(shí)際所讀的字節(jié)數(shù)。
如果返回的值是 0 表示已經(jīng)讀到文件的結(jié)束了,小于 0 表示出現(xiàn)了錯(cuò)誤。
如果錯(cuò)誤為 EINTR 說明讀是由中斷引起的;如果是 ECONNREST 表示網(wǎng)絡(luò)連接出了問題。
write()
write 函數(shù)將 buf 中的 nbytes 字節(jié)內(nèi)容寫入文件描述符 fd。
成功時(shí)返回寫的字節(jié)數(shù)。失敗時(shí)返回 -1,并設(shè)置 errno 變量。
在網(wǎng)絡(luò)程序中,當(dāng)我們向套接字文件描述符寫時(shí)有倆種可能。
(1)write 的返回值大于 0,表示寫了部分或者是全部的數(shù)據(jù)。
(2)返回的值小于 0,此時(shí)出現(xiàn)了錯(cuò)誤。
如果錯(cuò)誤為 EINTR 表示在寫的時(shí)候出現(xiàn)了中斷錯(cuò)誤;如果為 EPIPE 表示網(wǎng)絡(luò)連接出現(xiàn)了問題(對方已經(jīng)關(guān)閉了連接)。
Socket 中 TCP 的三次握手建立連接
我們知道 TCP 建立連接要進(jìn)行 “三次握手”,即交換三個(gè)分組。大致流程如下:
客戶端向服務(wù)器發(fā)送一個(gè) SYN J
服務(wù)器向客戶端響應(yīng)一個(gè) SYN K,并對 SYN J 進(jìn)行確認(rèn) ACK J+1
客戶端再想服務(wù)器發(fā)一個(gè)確認(rèn) ACK K+1
只有就完了三次握手,但是這個(gè)三次握手發(fā)生在 Socket 的那幾個(gè)函數(shù)中呢?請看下圖:
從圖中可以看出:
(1)當(dāng)客戶端調(diào)用 connect 時(shí),觸發(fā)了連接請求,向服務(wù)器發(fā)送了 SYN J 包,這時(shí) connect 進(jìn)入阻塞狀態(tài);
(2)服務(wù)器監(jiān)聽到連接請求,即收到 SYN J 包,調(diào)用 accept 函數(shù)接收請求向客戶端發(fā)送 SYN K ,ACK J+1,這時(shí) accept 進(jìn)入阻塞狀態(tài);
(3)客戶端收到服務(wù)器的 SYN K ,ACK J+1 之后,這時(shí) connect 返回,并對 SYN K 進(jìn)行確認(rèn);
(4)服務(wù)器收到 ACK K+1 時(shí),accept 返回,至此三次握手完畢,連接建立。
Socket 中 TCP 的四次握手釋放連接
上面介紹了 socket 中 TCP 的三次握手建立過程,及其涉及的 socket 函數(shù)。現(xiàn)在我們介紹 socket 中的四次握手釋放連接的過程,請看下圖:
圖示過程如下:
某個(gè)應(yīng)用進(jìn)程首先調(diào)用 close 主動(dòng)關(guān)閉連接,這時(shí) TCP 發(fā)送一個(gè) FIN M;
另一端接收到 FIN M 之后,執(zhí)行被動(dòng)關(guān)閉,對這個(gè) FIN 進(jìn)行確認(rèn)。它的接收也作為文件結(jié)束符傳遞給應(yīng)用進(jìn)程,因?yàn)?FIN 的接收意味著應(yīng)用進(jìn)程在相應(yīng)的連接上再也接收不到額外數(shù)據(jù);
一段時(shí)間之后,接收到文件結(jié)束符的應(yīng)用進(jìn)程調(diào)用 close 關(guān)閉它的 socket。這導(dǎo)致它的 TCP 也發(fā)送一個(gè) FIN N;
接收到這個(gè) FIN 的源發(fā)送端 TCP 對它進(jìn)行確認(rèn)。
這樣每個(gè)方向上都有一個(gè) FIN 和 ACK。
————
今天的分享就到這里了,大家要好好學(xué)C++喲~
編輯:jq
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7170瀏覽量
89705 -
Socket
+關(guān)注
關(guān)注
0文章
212瀏覽量
34914 -
編程
+關(guān)注
關(guān)注
88文章
3640瀏覽量
94036 -
TCP
+關(guān)注
關(guān)注
8文章
1381瀏覽量
79342 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4346瀏覽量
63022
發(fā)布評論請先 登錄
相關(guān)推薦
socket 和 UDP 協(xié)議的對比
socket 在物聯(lián)網(wǎng)中的應(yīng)用
socket 多線程編程實(shí)現(xiàn)方法
socket 發(fā)送和接收數(shù)據(jù)方法
socket 網(wǎng)絡(luò)通信協(xié)議解析
socket 編程基礎(chǔ)入門
飛凌嵌入式ElfBoard ELF 1板卡-網(wǎng)絡(luò)編程示例之socket編程
socket編程中的錯(cuò)誤處理技巧
C語言中的socket編程基礎(chǔ)
socket編程中的阻塞與非阻塞
什么是socket編程 socket與tcp/ip協(xié)議的關(guān)系
socket的基本概念和原理
簡述socket編程中的常用函數(shù)
如何理解socket編程接口
C++中實(shí)現(xiàn)類似instanceof的方法
![<b class='flag-5'>C++</b><b class='flag-5'>中</b>實(shí)現(xiàn)類似instanceof的方法](https://file1.elecfans.com/web2/M00/FE/0C/wKgaomaYe1CAQ31QAAAnf0IkoSU605.png)
評論