0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++中網(wǎng)絡(luò)編程Socket介紹

C語言編程學(xué)習(xí)基地 ? 來源:C語言編程學(xué)習(xí)基地 ? 作者:C語言編程學(xué)習(xí)基地 ? 2021-10-26 10:10 ? 次閱讀

Socket

Linux Socket 編程(不限 Linux)

a9b4f35c-357e-11ec-82a8-dac502259ad0.jpg

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)了問題(對(duì)方已經(jīng)關(guān)閉了連接)。

Socket 中 TCP 的三次握手建立連接

我們知道 TCP 建立連接要進(jìn)行 “三次握手”,即交換三個(gè)分組。大致流程如下:

客戶端向服務(wù)器發(fā)送一個(gè) SYN J

服務(wù)器向客戶端響應(yīng)一個(gè) SYN K,并對(duì) SYN J 進(jìn)行確認(rèn) ACK J+1

客戶端再想服務(wù)器發(fā)一個(gè)確認(rèn) ACK K+1

只有就完了三次握手,但是這個(gè)三次握手發(fā)生在 Socket 的那幾個(gè)函數(shù)中呢?請(qǐng)看下圖:

a9c8e056-357e-11ec-82a8-dac502259ad0.png

從圖中可以看出:

(1)當(dāng)客戶端調(diào)用 connect 時(shí),觸發(fā)了連接請(qǐng)求,向服務(wù)器發(fā)送了 SYN J 包,這時(shí) connect 進(jìn)入阻塞狀態(tài);

(2)服務(wù)器監(jiān)聽到連接請(qǐng)求,即收到 SYN J 包,調(diào)用 accept 函數(shù)接收請(qǐng)求向客戶端發(fā)送 SYN K ,ACK J+1,這時(shí) accept 進(jìn)入阻塞狀態(tài);

(3)客戶端收到服務(wù)器的 SYN K ,ACK J+1 之后,這時(shí) connect 返回,并對(duì) SYN K 進(jìn)行確認(rèn);

(4)服務(wù)器收到 ACK K+1 時(shí),accept 返回,至此三次握手完畢,連接建立。

Socket 中 TCP 的四次握手釋放連接

上面介紹了 socket 中 TCP 的三次握手建立過程,及其涉及的 socket 函數(shù)?,F(xiàn)在我們介紹 socket 中的四次握手釋放連接的過程,請(qǐng)看下圖:

圖示過程如下:

某個(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)閉,對(duì)這個(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 對(duì)它進(jìn)行確認(rèn)。

這樣每個(gè)方向上都有一個(gè) FIN 和 ACK。

————

今天的分享就到這里了,大家要好好學(xué)C++喲~

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11177

    瀏覽量

    208487
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3544

    瀏覽量

    93482
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2090

    瀏覽量

    73406

原文標(biāo)題:C++基礎(chǔ)語法梳理:網(wǎng)絡(luò)編程丨Socket

文章出處:【微信號(hào):cyuyanxuexi,微信公眾號(hào):C語言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    socket和http區(qū)別是什么

    Socket和HTTP是兩種不同的網(wǎng)絡(luò)通信協(xié)議,它們?cè)?b class='flag-5'>網(wǎng)絡(luò)編程中扮演著重要的角色。 定義 Socket(套接字)是一種通信端點(diǎn),它提供了一個(gè)
    的頭像 發(fā)表于 08-16 11:04 ?515次閱讀

    socket的基本概念和原理

    Socket是一種通信協(xié)議,用于在網(wǎng)絡(luò)中實(shí)現(xiàn)進(jìn)程間的通信。它是一種抽象的編程接口,允許應(yīng)用程序通過網(wǎng)絡(luò)發(fā)送和接收數(shù)據(jù)。 1. 什么是Socket
    的頭像 發(fā)表于 08-16 10:51 ?650次閱讀

    簡述socket編程中的常用函數(shù)

    Socket編程是一種基于TCP/IP協(xié)議的網(wǎng)絡(luò)編程技術(shù),它允許應(yīng)用程序通過網(wǎng)絡(luò)進(jìn)行通信。在Socket
    的頭像 發(fā)表于 08-16 10:49 ?216次閱讀

    如何理解socket編程接口

    Socket編程接口是一種網(wǎng)絡(luò)編程的基本概念,它提供了一種在不同計(jì)算機(jī)之間進(jìn)行通信的方法。 Socket
    的頭像 發(fā)表于 08-16 10:48 ?286次閱讀

    鴻蒙開發(fā)實(shí)戰(zhàn):【網(wǎng)絡(luò)管理-Socket連接】

    Socket網(wǎng)絡(luò)通信方面的應(yīng)用,展示了Socket在兩端設(shè)備的連接驗(yàn)證、聊天通信方面的應(yīng)用。
    的頭像 發(fā)表于 03-19 22:04 ?787次閱讀
    鴻蒙開發(fā)實(shí)戰(zhàn):【<b class='flag-5'>網(wǎng)絡(luò)</b>管理-<b class='flag-5'>Socket</b>連接】

    c語言,c++,java,python區(qū)別

    C語言、C++、Java和Python是四種常見的編程語言,各有優(yōu)點(diǎn)和特點(diǎn)。 C語言: C語言是一種面向過程的
    的頭像 發(fā)表于 02-05 14:11 ?1671次閱讀

    vb語言和c++語言的區(qū)別

    VB語言和C++語言是兩種不同的編程語言,雖然它們都屬于高級(jí)編程語言,但在設(shè)計(jì)和用途上有很多區(qū)別。下面將詳細(xì)比較VB語言和C++語言的區(qū)別。 設(shè)計(jì)目標(biāo): VB語言(Visual Bas
    的頭像 發(fā)表于 02-01 10:20 ?1801次閱讀

    物聯(lián)網(wǎng)LWIP之socket編程

    一,基礎(chǔ)概念在我看來Socket就相當(dāng)于API,就是函數(shù)接口,我們使用Socket就可以在不清楚底層原理的基礎(chǔ)上進(jìn)行通信,即Socket會(huì)幫助我們處理好網(wǎng)絡(luò)的Ip地址等。下圖就清晰地展
    的頭像 發(fā)表于 01-18 08:00 ?1089次閱讀
    物聯(lián)網(wǎng)LWIP之<b class='flag-5'>socket</b><b class='flag-5'>編程</b>

    C++簡史:C++是如何開始的

    MISRA C++:2023,MISRA? C++ 標(biāo)準(zhǔn)的下一個(gè)版本,來了!為了幫助您做好準(zhǔn)備,我們介紹了 Perforce 首席技術(shù)支持工程師 Frank van den Beuken 博士撰寫
    的頭像 發(fā)表于 01-11 09:00 ?487次閱讀
    <b class='flag-5'>C++</b>簡史:<b class='flag-5'>C++</b>是如何開始的

    基于C/C++面向?qū)ο蟮姆绞椒庋bsocket通信類

    在掌握了基于 TCP 的套接字通信流程之后,為了方便使用,提高編碼效率,可以對(duì)通信操作進(jìn)行封裝,本著有淺入深的原則,先基于 C 語言進(jìn)行面向過程的函數(shù)封裝,然后再基于 C++ 進(jìn)行面向?qū)ο蟮念惙庋b。
    的頭像 發(fā)表于 12-26 09:57 ?1220次閱讀

    c++怎么開始編程

    應(yīng)用程序、嵌入式系統(tǒng)和網(wǎng)絡(luò)應(yīng)用程序等各種領(lǐng)域。 在開始編程之前,你需要安裝C++編程環(huán)境。首先,你需要下載并安裝一個(gè)編譯器,比如微軟的Visual Studio、GNU的GCC或者C
    的頭像 發(fā)表于 11-27 15:56 ?826次閱讀

    使用Visual C++進(jìn)行串口通信編程

    電子發(fā)燒友網(wǎng)站提供《使用Visual C++進(jìn)行串口通信編程.doc》資料免費(fèi)下載
    發(fā)表于 11-21 09:39 ?3次下載
    使用Visual <b class='flag-5'>C++</b>進(jìn)行串口通信<b class='flag-5'>編程</b>

    Socket 網(wǎng)絡(luò)編程框架介紹

    Socket 網(wǎng)絡(luò)編程框架 Socket(套接字)是一個(gè)網(wǎng)絡(luò)編程概念,描述了一個(gè)通信端點(diǎn)(End
    的頭像 發(fā)表于 11-09 14:19 ?952次閱讀
    <b class='flag-5'>Socket</b> <b class='flag-5'>網(wǎng)絡(luò)</b><b class='flag-5'>編程</b>框架<b class='flag-5'>介紹</b>

    Linux C/C++編程中的內(nèi)存泄漏問題

    ,需要對(duì)各種編程語言和技術(shù)有深入的理解。而C++,作為一種高性能的編程語言,在許多領(lǐng)域(如網(wǎng)絡(luò)編程、嵌入式系統(tǒng)、音視頻處理等)都發(fā)揮著不可忽
    的頭像 發(fā)表于 11-09 10:11 ?923次閱讀
    Linux <b class='flag-5'>C</b>/<b class='flag-5'>C++</b><b class='flag-5'>編程</b>中的內(nèi)存泄漏問題

    C++之父新作帶你勾勒現(xiàn)代C++地圖

    為了幫助大家解決這些痛點(diǎn)問題,讓大家領(lǐng)略現(xiàn)代C++之美,掌握其中的精髓,更好地使用C++C++之父Bjarne Stroustrup坐不住了,他親自操刀寫就了這本《C++之旅》!
    的頭像 發(fā)表于 10-30 16:35 ?750次閱讀
    <b class='flag-5'>C++</b>之父新作帶你勾勒現(xiàn)代<b class='flag-5'>C++</b>地圖