《TCP 網絡編程實戰:開發流程、緩沖區原理、三次握手與四次揮手》

一、 TCP 網絡應用程序開發流程

學習目標

  • 能夠知道TCP客戶端程序的開發流程

1. TCP 網絡應用程序開發流程的介紹

TCP 網絡應用程序開發分為:

  • TCP 客戶端程序開發
  • TCP 服務端程序開發

說明:

客戶端程序是指運行在用戶設備上的程序 服務端程序是指運行在服務器設備上的程序,專門為客戶端提供數據服務。

2. TCP 客戶端程序開發流程的介紹

在這里插入圖片描述

步驟說明:

  1. 創建客戶端套接字對象
  2. 和服務端套接字建立連接
  3. 發送數據
  4. 接收數據
  5. 關閉客戶端套接字

3. TCP 服務端程序開發流程的介紹

步驟說明:

  1. 創建服務端端套接字對象
  2. 綁定端口號
  3. 設置監聽
  4. 等待接受客戶端的連接請求
  5. 接收數據
  6. 發送數據
  7. 關閉套接字

4. 小結

  1. TCP 網絡應用程序開發分為客戶端程序開發服務端程序開發
  2. 主動發起建立連接請求的是客戶端程序
  3. 等待接受連接請求的是服務端程序

二、socket之send和recv原理剖析

學習目標

  • 能夠知道send和recv的底層工作原理

1. 認識TCP socket的發送和接收緩沖區

當創建一個TCP socket對象的時候會有一個發送緩沖區和一個接收緩沖區這個發送和接收緩沖區指的就是內存中的一片空間。

2. send原理剖析

send是不是直接把數據發給服務端?

不是,要想發數據,必須得通過網卡發送數據,應用程序是無法直接通過網卡發送數據的,它需要調用操作系統接口,也就是說,應用程序把發送的數據先寫入到發送緩沖區(內存中的一片空間),再由操作系統控制網卡把發送緩沖區的數據發送給服務端網卡

3. recv原理剖析

recv是不是直接從客戶端接收數據?

不是,應用軟件是無法直接通過網卡接收數據的,它需要調用操作系統接口,由操作系統通過網卡接收數據,把接收的數據寫入到接收緩沖區(內存中的一片空間),應用程序再從接收緩存區獲取客戶端發送的數據

4. send和recv原理剖析圖

在這里插入圖片描述

說明:

  • 發送數據是發送到發送緩沖區
  • 接收數據是從接收緩沖區 獲取

5. 小結

不管是recv還是send都不是直接接收到對方的數據和發送數據到對方,發送數據會寫入到發送緩沖區,接收數據是從接收緩沖區來讀取,發送數據和接收數據最終是由操作系統控制網卡來完成。

三、TCP服務端程序開發

學習目標

  • 能夠寫出TCP服務端應用程序接收和發送消息

1. 開發 TCP 服務端程序開發步驟回顧

  1. 創建服務端端套接字對象
  2. 綁定端口號
  3. 設置監聽
  4. 等待接受客戶端的連接請求
  5. 接收數據
  6. 發送數據
  7. 關閉套接字

2. socket 類的介紹

導入 socket 模塊
import socket

創建服務端 socket 對象
socket.socket(AddressFamily, Type)

參數說明:

  • AddressFamily 表示IP地址類型, 分為TPv4和IPv6
  • Type 表示傳輸協議類型

方法說明:

  • bind((host, port)) 表示綁定端口號, host 是 ip 地址,port 是端口號,ip 地址一般不指定,表示本機的任何一個ip地址都可以。
  • listen (backlog) 表示設置監聽,backlog參數表示最大等待建立連接的個數。
  • accept() 表示等待接受客戶端的連接請求
  • send(data) 表示發送數據,data 是二進制數據
  • recv(buffersize) 表示接收數據, buffersize 是每次接收數據的長度

3. TCP 服務端程序開發示例代碼

import socketif __name__ == '__main__':# 創建tcp服務端套接字tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 設置端口號復用,讓程序退出端口號立即釋放tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)# 給程序綁定端口號tcp_server_socket.bind(("", 8989))# 設置監聽# 128:最大等待建立連接的個數, 提示: 目前是單任務的服務端,同一時刻只能服務與一個客戶端,后續使用多任務能夠讓服務端同時服務與多個客戶端,# 不需要讓客戶端進行等待建立連接# listen后的這個套接字只負責接收客戶端連接請求,不能收發消息,收發消息使用返回的這個新套接字來完成tcp_server_socket.listen(128)# 等待客戶端建立連接的請求, 只有客戶端和服務端建立連接成功代碼才會解阻塞,代碼才能繼續往下執行

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67606.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67606.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67606.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

新年新挑戰:如何用LabVIEW開發跨平臺應用

新的一年往往伴隨著各種新的項目需求,而跨平臺應用開發無疑是當前備受矚目的發展趨勢。在眾多開發工具中,LabVIEW 以其獨特的圖形化編程方式和強大的功能,為開發跨平臺應用提供了有效的途徑。本文將深入探討如何運用 LabVIEW 開發能夠在不同操…

C 語言實現計算一年中指定日期是第幾天?題】

引言 在編程的世界里,處理日期和時間相關的問題是非常常見的。比如在日歷應用、任務管理系統、數據分析等場景中,經常需要計算某個日期在一年中是第幾天。本文將詳細介紹如何使用 C 語言來實現這一功能,通過分析代碼的結構、邏輯以及可能存在…

rsync安裝與使用-linux015

使用 rsync 可以非常高效地將文件或目錄從一個服務器傳輸到另一個服務器。 能力: 支持 64 位文件、64 位 inode、64 位時間戳、64 位長整型支持套接字對、符號鏈接、符號鏈接時間、硬鏈接、硬鏈接特殊文件、硬鏈接符號鏈接支持 IPv6、訪問時間(atimes&…

UE5.3 C++ CDO的初步理解

一.UObject UObject是所有對象的基類,往上還有UObjectBaseUtility。 注釋:所有虛幻引擎對象的基類。對象的類型由基于 UClass 類來定義。 這為創建和使用UObject的對象提供了 函數,并且提供了應在子類中重寫的虛函數。 /** * The base cla…

Pandas基礎06(異常值的檢測與過濾/抽樣/常用聚合函數/數據聚合)

Pandas基礎06 異常值的檢測與過濾 在數據分析中,異常值(Outliers)是指與其他數據點顯著不同的值。這些值可能由于數據錄入錯誤、設備故障或極端情況而產生,因此在進行數據分析之前,需要對其進行檢測與過濾。本文將介紹…

【PyTorch】4.張量拼接操作

個人主頁:Icomi 在深度學習蓬勃發展的當下,PyTorch 是不可或缺的工具。它作為強大的深度學習框架,為構建和訓練神經網絡提供了高效且靈活的平臺。神經網絡作為人工智能的核心技術,能夠處理復雜的數據模式。通過 PyTorch&#xff0…

jstat命令詳解

jstat 用于監視虛擬機運行時狀態信息的命令,它可以顯示出虛擬機進程中的類裝載、內存、垃圾收集、JIT 編譯等運行數據。 命令的使用格式如下。 jstat [option] LVMID [interval] [count]各個參數詳解: option:操作參數LVMID:本…

App.Current.Services.GetService<UserView>()無限循環

代碼無線循環 public partial class UserView : UserControl{public UserView(){InitializeComponent();InitData();}private void InitData(){DataContext App.Current.Services.GetService<UserView>();}} } DataContext App.Current.Services.GetService<User…

(動態規劃路徑基礎 最小路徑和)leetcode 64

視頻教程 1.初始化dp數組&#xff0c;初始化邊界 2、從[1行到n-1行][1列到m-1列]依次賦值 #include<vector> #include<algorithm> #include <iostream>using namespace std; int main() {vector<vector<int>> grid { {1,3,1},{1,5,1},{4,2,1}…

松靈機器人 scout ros2 驅動 安裝

必須使用 ubuntu22 必須使用 鏈接的humble版本 #打開can 口 sudo modprobe gs_usbsudo ip link set can0 up type can bitrate 500000sudo ip link set can0 up type can bitrate 500000sudo apt install can-utilscandump can0mkdir -p ~/ros2_ws/srccd ~/ros2_ws/src git cl…

pytorch基于GloVe實現的詞嵌入

PyTorch 實現 GloVe&#xff08;Global Vectors for Word Representation&#xff09; 的完整代碼&#xff0c;使用 中文語料 進行訓練&#xff0c;包括 共現矩陣構建、模型定義、訓練和測試。 1. GloVe 介紹 基于詞的共現信息&#xff08;不像 Word2Vec 使用滑動窗口預測&…

C++ 堆棧分配的區別

這兩種聲明方式有什么區別 1.使用 new 關鍵字動態分配內存 動態分配&#xff1a;使用 new 關鍵字會在堆&#xff08;heap&#xff09;上分配內存&#xff0c;并返回一個指向該內存位置的指針。生命周期&#xff1a;對象的生命周期不會隨著聲明它的作用域結束而結束&#xff0…

深入解析 Linux 內核中的頁面錯誤處理機制

在現代操作系統中,頁面錯誤(Page Fault)是內存管理的重要組成部分。當程序試圖訪問未映射到物理內存的虛擬內存地址時,CPU 會觸發頁面錯誤異常。Linux 內核通過一系列復雜的機制來處理這些異常,確保系統的穩定性和性能。本文將深入解析 Linux 內核中處理頁面錯誤的核心代碼…

MATLAB-Simulink并行仿真示例

一、概述 在進行simulink仿真的過程中常常遇到CPU利用率較低&#xff0c;仿真緩慢的情況&#xff0c;可以借助并行仿真改善這些問題&#xff0c;其核心思想是將參數掃描、蒙特卡洛分析或多工況驗證等任務拆分成多個子任務&#xff0c;利用多核CPU或計算集群的并行計算能力&…

Workbench 中的熱源仿真

探索使用自定義工具對移動熱源進行建模及其在不同行業中的應用。 了解熱源動力學 對移動熱源進行建模為各種工業過程和應用提供了有價值的見解。激光加熱和材料加工使用許多激光束來加熱、焊接或切割材料。盡管在某些情況下&#xff0c;熱源 &#xff08;q&#xff09; 不是通…

I2C基礎知識

引言 這里祝大家新年快樂&#xff01;前面我們介紹了串口通訊協議&#xff0c;現在我們繼續來介紹另一種常見的簡單的串行通訊方式——I2C通訊協議。 一、什么是I2C I2C 通訊協議&#xff08;Inter-Integrated Circuit&#xff09;是由Phiilps公司在上個世紀80年代開發的&#…

深度學習 DAY3:NLP發展史

NLP發展史 NLP發展脈絡簡要梳理如下&#xff1a; (遠古模型&#xff0c;上圖沒有但也可以算NLP&#xff09; 1940 - BOW&#xff08;無序統計模型&#xff09; 1950 - n-gram&#xff08;基于詞序的模型&#xff09; (近代模型&#xff09; 2001 - Neural language models&am…

CSS 背景與邊框:從基礎到高級應用

CSS 背景與邊框&#xff1a;從基礎到高級應用 1. CSS 背景樣式1.1 背景顏色示例代碼&#xff1a;設置背景顏色 1.2 背景圖像示例代碼&#xff1a;設置背景圖像 1.3 控制背景平鋪行為示例代碼&#xff1a;控制背景平鋪 1.4 調整背景圖像大小示例代碼&#xff1a;調整背景圖像大小…

HarmonyOS簡介:應用開發的機遇、挑戰和趨勢

問題 更多的智能設備并沒有帶來更好的全場景體驗 連接步驟復雜數據難以互通生態無法共享能力難以協同 主要挑戰 針對不同設備上的不同操作系統&#xff0c;重復開發&#xff0c;維護多套版本 多種語言棧&#xff0c;對人員技能要求高 多種開發框架&#xff0c;不同的編程…

【Linux】列出所有連接的 WiFi 網絡的密碼

【Linux】列出所有連接的 WiFi 網絡的密碼 終端輸入 sudo grep psk /etc/NetworkManager/system-connections/*會列出所有連接過 Wifi 的信息&#xff0c;格式類似 /etc/NetworkManager/system-connections/AAAAA.nmconnection:pskBBBBBAAAAA 是 SSID&#xff0c;BBBBB 是對…