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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

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

C語言編程學習基地 ? 來源:C語言編程學習基地 ? 作者: 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ù)是負責從 fd 中讀取內(nèi)容。

當讀成功時,read 返回實際所讀的字節(jié)數(shù)。

如果返回的值是 0 表示已經(jīng)讀到文件的結束了,小于 0 表示出現(xiàn)了錯誤。

如果錯誤為 EINTR 說明讀是由中斷引起的;如果是 ECONNREST 表示網(wǎng)絡連接出了問題。

write()

write 函數(shù)將 buf 中的 nbytes 字節(jié)內(nèi)容寫入文件描述符 fd。

成功時返回寫的字節(jié)數(shù)。失敗時返回 -1,并設置 errno 變量。

在網(wǎng)絡程序中,當我們向套接字文件描述符寫時有倆種可能。

(1)write 的返回值大于 0,表示寫了部分或者是全部的數(shù)據(jù)。

(2)返回的值小于 0,此時出現(xiàn)了錯誤。

如果錯誤為 EINTR 表示在寫的時候出現(xiàn)了中斷錯誤;如果為 EPIPE 表示網(wǎng)絡連接出現(xiàn)了問題(對方已經(jīng)關閉了連接)。

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

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

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

服務器向客戶端響應一個 SYN K,并對 SYN J 進行確認 ACK J+1

客戶端再想服務器發(fā)一個確認 ACK K+1

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

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

從圖中可以看出:

(1)當客戶端調(diào)用 connect 時,觸發(fā)了連接請求,向服務器發(fā)送了 SYN J 包,這時 connect 進入阻塞狀態(tài);

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

(3)客戶端收到服務器的 SYN K ,ACK J+1 之后,這時 connect 返回,并對 SYN K 進行確認;

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

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

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

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

圖示過程如下:

某個應用進程首先調(diào)用 close 主動關閉連接,這時 TCP 發(fā)送一個 FIN M;

另一端接收到 FIN M 之后,執(zhí)行被動關閉,對這個 FIN 進行確認。它的接收也作為文件結束符傳遞給應用進程,因為 FIN 的接收意味著應用進程在相應的連接上再也接收不到額外數(shù)據(jù);

一段時間之后,接收到文件結束符的應用進程調(diào)用 close 關閉它的 socket。這導致它的 TCP 也發(fā)送一個 FIN N;

接收到這個 FIN 的源發(fā)送端 TCP 對它進行確認。

這樣每個方向上都有一個 FIN 和 ACK。

————

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

編輯:jq

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

    關注

    8

    文章

    7035

    瀏覽量

    89047
  • Socket
    +關注

    關注

    0

    文章

    212

    瀏覽量

    34697
  • 編程
    +關注

    關注

    88

    文章

    3616

    瀏覽量

    93742
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1353

    瀏覽量

    79078
  • 函數(shù)
    +關注

    關注

    3

    文章

    4331

    瀏覽量

    62633
收藏 人收藏

    評論

    相關推薦

    socket 多線程編程實現(xiàn)方法

    在現(xiàn)代網(wǎng)絡編程,多線程技術被廣泛應用于提高服務器的并發(fā)處理能力。Socket編程網(wǎng)絡通信的基
    的頭像 發(fā)表于 11-12 14:16 ?359次閱讀

    socket 網(wǎng)絡通信協(xié)議解析

    通信機制,它允許兩個程序(通常位于不同的計算機上)進行雙向通信。在網(wǎng)絡編程,Socket被用來實現(xiàn)客戶端和服務器之間的數(shù)據(jù)交換。一個Socket
    的頭像 發(fā)表于 11-12 14:04 ?628次閱讀

    socket 編程基礎入門

    Socket 編程基礎入門 在計算機網(wǎng)絡Socket 是一個抽象層,它將網(wǎng)絡通信的細節(jié)隱藏起
    的頭像 發(fā)表于 11-12 14:03 ?316次閱讀

    socket編程的錯誤處理技巧

    Socket編程網(wǎng)絡編程的基礎,它允許程序之間通過TCP/IP協(xié)議進行通信。然而,網(wǎng)絡通信是不穩(wěn)定的,可能會遇到各種問題,如
    的頭像 發(fā)表于 11-01 17:47 ?862次閱讀

    C語言中的socket編程基礎

    Socket編程簡介 Socket是一種通信機制,允許程序之間進行通信。在C語言中,socket編程
    的頭像 發(fā)表于 11-01 16:51 ?325次閱讀

    socket編程的阻塞與非阻塞

    網(wǎng)絡編程, socket 是一個非常重要的概念,它提供了一個抽象層,使得開發(fā)者可以不必關心底層的網(wǎng)絡通信細節(jié)。
    的頭像 發(fā)表于 11-01 16:13 ?212次閱讀

    什么是socket編程 socket與tcp/ip協(xié)議的關系

    什么是Socket編程 Socket編程是一種網(wǎng)絡編程技術,它允許程序之間進行通信。在計算機科學
    的頭像 發(fā)表于 11-01 16:01 ?336次閱讀

    socket的基本概念和原理

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

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

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

    如何理解socket編程接口

    不同計算機之間進行通信的方法。在網(wǎng)絡編程Socket被廣泛用于實現(xiàn)客戶端和服務器之間的通信。 1.2 Socket的分類 根據(jù)通信方式的
    的頭像 發(fā)表于 08-16 10:48 ?422次閱讀

    C++實現(xiàn)類似instanceof的方法

    函數(shù),可實際上C++沒有。但是別著急,其實C++中有兩種簡單的方法可以實現(xiàn)類似Java的instanceof的功能。 在 C++
    的頭像 發(fā)表于 07-18 10:16 ?592次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>中</b>實現(xiàn)類似instanceof的方法

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

    操作系統(tǒng)、嵌入式系統(tǒng)等對性能要求較高的場景。C語言的語法相對簡單,學習曲線較平緩,也是學習其他高級語言的入門語言。 C++C++是在C
    的頭像 發(fā)表于 02-05 14:11 ?2397次閱讀

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

    Microsoft開發(fā)的一種面向?qū)ο蟮氖录?qū)動編程語言。它的設計目標是簡化編程過程,讓初學者也能快速上手。與相比,C++語言是一種通用的、面向?qū)ο蟮?/div>
    的頭像 發(fā)表于 02-01 10:20 ?2326次閱讀

    物聯(lián)網(wǎng)LWIPsocket編程

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

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

    的 MISRA C++:2023 博客系列的第二部分。 在這篇博客,我們將深入探討 C++ 的歷史、編程語言多年來的發(fā)展歷程以及它的下一步發(fā)展方向。
    的頭像 發(fā)表于 01-11 09:00 ?598次閱讀
    <b class='flag-5'>C++</b>簡史:<b class='flag-5'>C++</b>是如何開始的