91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

淺析C++基礎(chǔ)語法梳理之網(wǎng)絡(luò)編程中Socket

C語言編程學(xué)習(xí)基地 ? 來源:C語言編程學(xué)習(xí)基地 ? 作者: C語言編程 ? 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)了問題(對方已經(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ù)中呢?請看下圖:

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

從圖中可以看出:

(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ù)?,F(xiàn)在我們介紹 socket 中的四次握手釋放連接的過程,請看下圖:

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

圖示過程如下:

某個(gè)應(yīng)用進(jìn)程首先調(diào)用 close 主動關(guān)閉連接,這時(shí) TCP 發(fā)送一個(gè) FIN M;

另一端接收到 FIN M 之后,執(zhí)行被動關(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

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

    關(guān)注

    8

    文章

    7335

    瀏覽量

    94801
  • Socket
    +關(guān)注

    關(guān)注

    1

    文章

    214

    瀏覽量

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

    關(guān)注

    90

    文章

    3716

    瀏覽量

    97201
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1425

    瀏覽量

    83536
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4417

    瀏覽量

    67545
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    輕松掌握——LuatOS socket基礎(chǔ)知識和應(yīng)用開發(fā)

    LuatOS環(huán)境創(chuàng)建客戶端與服務(wù)器、發(fā)送與接收數(shù)據(jù)等關(guān)鍵技能,為后續(xù)復(fù)雜應(yīng)用打下堅(jiān)實(shí)基礎(chǔ)。 一、主要內(nèi)容 LuatOS socket是LuatOS開發(fā)中最常用到的網(wǎng)絡(luò)應(yīng)用之一; LuatOS
    的頭像 發(fā)表于 01-28 20:07 ?183次閱讀
    輕松掌握——LuatOS  <b class='flag-5'>socket</b>基礎(chǔ)知識和應(yīng)用開發(fā)

    keil實(shí)現(xiàn)cc++混合編程

    起因項(xiàng)目中使用到一個(gè)開源的模擬IIC的庫,封裝的比較好,但是是使用c++寫的。于是將其移植到自己的項(xiàng)目中,主要有以下三步操作: 在工程選項(xiàng) C/C++中去掉勾選
    發(fā)表于 01-26 08:58

    汽車網(wǎng)絡(luò)安全開發(fā)語言選型指南:C/C++/Rust/Java等主流語言對比+Perforce QAC/Klocwork工具支持

    汽車網(wǎng)絡(luò)安全如何選編程語言?C、C++、Rust、Java……誰更適合AUTOSAR、ISO/SAE 21434?一文了解8種主流語言的優(yōu)劣與適用場景,以及Perforce QAC/K
    的頭像 發(fā)表于 12-26 11:13 ?442次閱讀
    汽車<b class='flag-5'>網(wǎng)絡(luò)</b>安全開發(fā)語言選型指南:<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>/Rust/Java等主流語言對比+Perforce QAC/Klocwork工具支持

    C語言與C++的區(qū)別及聯(lián)系

    C語言和C++到底是什么關(guān)系? 首先C++C語言本來就是兩種不同的編程語言,但C++確實(shí)是對
    發(fā)表于 12-24 07:23

    CC++之間的聯(lián)系

    1、語法兼容性: C++完全兼容C語言的語法,這意味著任何有效的C語言程序都可以直接在C++
    發(fā)表于 12-11 06:51

    C語言和C++之間的區(qū)別是什么

    C++的標(biāo)準(zhǔn)庫那樣集成度高和功能齊全。 6、編譯器與語言特性: C++編譯器通常比C語言編譯器更加復(fù)雜,因?yàn)樗枰幚砀嗟恼Z言特性,比如模板元編程、命名空間、引用等。
    發(fā)表于 12-11 06:23

    如何調(diào)試和編程CW32F030C8T7?支持哪些調(diào)試工具和編程語言?

    了解如何調(diào)試和編程CW32F030C8T7是開發(fā)過程的重要環(huán)節(jié)。它支持哪些調(diào)試工具(如JTAG、串口調(diào)試等)和編程語言(如C、
    發(fā)表于 12-05 06:48

    socket是什么

    Socket(套接字)是計(jì)算機(jī)網(wǎng)絡(luò)的一個(gè)概念,它指示了一個(gè)可以進(jìn)行網(wǎng)絡(luò)通信的軟件端點(diǎn)。通過使用Socket,計(jì)算機(jī)程序可以通過
    發(fā)表于 12-03 08:27

    C++程序異常的處理機(jī)制

    1、什么是異常處理? 有經(jīng)驗(yàn)的朋友應(yīng)該知道,在正常的CC++編程過程難免會碰到程序不按照原本設(shè)計(jì)運(yùn)行的情況。 最常見的有除法分母為零,數(shù)組越界,內(nèi)存分配失效、打開相應(yīng)文件失敗等等
    發(fā)表于 12-02 07:12

    強(qiáng)實(shí)時(shí)運(yùn)動控制內(nèi)核MotionRT750(六):us級高速交互C++,為智能裝備提速

    Windows下運(yùn)動控制實(shí)時(shí)內(nèi)核MotionRT750的高速交互C++
    的頭像 發(fā)表于 09-04 14:50 ?756次閱讀
    強(qiáng)實(shí)時(shí)運(yùn)動控制內(nèi)核MotionRT750(六):us級高速交互<b class='flag-5'>之</b><b class='flag-5'>C++</b>,為智能裝備提速

    技能+1!如何在樹莓派上使用C++控制GPIO?

    和PiGPIO等庫,C++可用于編程控制樹莓派的GPIO引腳。它提供了更好的性能和控制能力,非常適合對速度和精度要求較高的硬件項(xiàng)目。在樹莓派社區(qū),關(guān)于“Python
    的頭像 發(fā)表于 08-06 15:33 ?4164次閱讀
    技能+1!如何在樹莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    GraniStudio : TCP/IP(Socket)協(xié)議深度剖析

    Socket)客戶端與服務(wù)器模塊,通過高度封裝的可視化功能,將復(fù)雜的套接字通信邏輯轉(zhuǎn)化為簡單的 “拖拽式” 操作,為工業(yè)用戶構(gòu)建穩(wěn)定、高效的網(wǎng)絡(luò)通信系統(tǒng)提供了強(qiáng)大支撐。本文將從技術(shù)原理、功能實(shí)現(xiàn)、應(yīng)用場景三個(gè)維度,深入解析 GraniStudio
    的頭像 發(fā)表于 08-03 22:20 ?1208次閱讀
    GraniStudio : TCP/IP(<b class='flag-5'>Socket</b>)協(xié)議深度剖析

    C++ 與 Python:樹莓派上哪種語言更優(yōu)?

    Python是樹莓派上的首選編程語言,我們的大部分教程都使用它。然而,C++在物聯(lián)網(wǎng)項(xiàng)目中同樣廣受歡迎且功能強(qiáng)大。那么,在樹莓派項(xiàng)目中選擇哪種語言更合適呢?Python因其簡潔性、豐富的庫和資源而被
    的頭像 發(fā)表于 07-24 15:32 ?956次閱讀
    <b class='flag-5'>C++</b> 與 Python:樹莓派上哪種語言更優(yōu)?

    請問在k230的Socket、MQTT等常用網(wǎng)絡(luò)編程應(yīng)用如何實(shí)現(xiàn)圖像傳輸呢?

    Socket、MQTT,或者網(wǎng)絡(luò)通信應(yīng)用如何實(shí)現(xiàn)圖像傳輸呢? 能給幾個(gè)提示或者參考例程嗎。謝謝 micropython 請參考如下例子 https
    發(fā)表于 06-17 06:29

    C++學(xué)到什么程度可以找工作?

    、動態(tài)規(guī)劃、貪心算法等)。 3. **操作系統(tǒng)原理**:理解進(jìn)程與線程、并發(fā)控制、同步機(jī)制(如互斥鎖、信號量等)、進(jìn)程間通信等概念。 4. **網(wǎng)絡(luò)編程**:熟悉基于Socket網(wǎng)絡(luò)
    發(fā)表于 03-13 10:19