TCP套接字

1.概念

套接字是專門進行網絡間數據通信的一種文件類型,可以實現不同主機之間雙向通信,包含了需要交換的數據和通信雙方的IP地址和port端口號。

2.套接字文件的創建

int socket(int domain, int type, int protocol);
功能:該函數用來創建各種各樣不同的套接字
參數參數 domain:套接字所依賴的網絡介質AF_INET:表明是 ipv4AF_INET6:表明是 ipv6AF_LOCAL/AF_UNIX:表明是本地通信,不是網絡通信,專門指代域套接字參數 type:套接字的類型,常用的類型就一下2種SOCK_STREAM:提供一個有序的,可靠的,雙向的(全雙工),基于連接的 字節流套接字一個超大的數據傳輸都是有可能支持SOCK_DGRAM:提供一個數據包(非連接的,不可靠的,有最大長度要求的)套接字字節流優點:允許發送無窮大的數據,只不過在內核中給這些數據做了分割而是,但是實際上由于連續發送的原因,這些數據最終還是粘連在一起字節流缺點:對于接受端來說,接受到的多組數據都粘連在一起了,所以需要額外花功夫去區分從哪到哪是一組數據數據報優點:數據不會粘連,發幾次數據就是幾次數據數據報缺點:發送的數據由于不會粘連,需要手動的將超大數據分批次發送,每次發送的數據大小有上限參數 protocol : 套接字依賴的通信協議一般直接寫 0 ,表示根據 參數type 和 參數 domain,自動選擇通信協議一般情況下:AF_INET + SOCK_STREAM + 0 ,最終創建是一個 TCP 套接字AF_INET + SOCK_DGRAM + 0 ,最終創建的是一個 UDP 套接字


3.TCP和UDP區別

tcp是可靠的,基于連接的字節流協議

tcp 擁有流量控制功能,順序控制功能,應答重發功能,以保證在網絡不擁堵的時候,所有數據都能正確發送

udp協議由于非連接,沒有可靠的應答手段

所以 udp協議傳輸效率高于tcp協議,傳輸的穩定性低于tcp協議

udp協議容易丟包,但是速度快

4.向套接字中寫入ip和port

4.1目的

客戶端:

寫入 ip 的目的:通過ip地址,找到該客戶端想要連接的服務器在哪

寫入 port的目的:通過port明確,想要發送的數據,應該發送到服務器的哪個進程里面、哪個端口里面

服務器:

寫入 ip 的目的:過濾掉一些不想接受連接的客戶端,指定僅僅只接受哪些客戶端的連接

如果寫入:

192.168.1.1 : 表示,只接受ip地址為 192.168.1.1 客戶端的連接

192.168.1.0 :表示,只接受這個網段下,所有客戶端的連接,這個網段下有幾個客戶端取決于子網掩碼

0.0.0.0 :表示,不做任何過濾,允許所有客戶端的連接,服務器套接字ip地址一般都寫這個

寫入port的目的:由于客戶端發送數據時候,只會向特定port中發送數據,所以服務器在讀取客戶端所發送數據的時候,一定要去客戶端所填寫的port中讀取數據

4.2為套接字寫入ip和port的函數

int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:為套接字 sockfd 寫入 ip 和 port
參數 sockfd:準備寫入ip和port的套接字
參數 addr:類型為 sockaddr * ,是一個通用套接字結構體地址這里根據套接字種類的不同(ipv4,還是ipv6,還是本地域套接字),真實傳入的套接字結構體地址是不同的但是無論怎么不同,功能都是一樣這個參數的最終目的,都是用來描述套接字中的一些信息的比如說:tcp用的ipv4套接字,結構體里面就應該記錄了一個 ipv4的地址和一個port端口號tcp用的ipv6套接字,這里就應該傳入一個結構體,里面記錄了一個 ipv6地址和一個port端口號本地域套接字,這里就應該傳入一個結構體,里面記錄了一個本地套接字文件的路徑名我們如果使用的是 tcp套接字的話,這里要求提前準備一個struct sockaddr_in 類型的結構體
參數 addrlen:實際上就是參數 addr 的長度

5.通過套接字發送數據

專門針對套接字的發送函數

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:通過套接字sockfd,將數據發送到接收端
參數 sockfd、buf、len : 這3個參數和 write 一模一樣,意義也一樣
參數 flags : 唯一和write 不一樣的參數,這個參數一般只有2個選項0 :默認屬性,默認屬性下,send和write 一會兒事MSG_DONTWAIT : 填寫這個宏的話,會讓send函數稱為一個非阻塞型函數send 和 write 默認是阻塞函數send 和 write 什么時候會產生阻塞?當寫入數據的目標地點,接收區滿了之后,再次寫入數據,就會產生阻塞,等待接收區產生空余空間位置如果 send 和 write 變成 非阻塞函數之后接收區寫滿,再次send 或者 write 新寫入的數據將被丟棄,寫入失敗
返回值:成功返回寫入的數據的字節數,失敗返回 -1所以:send對比write的優點就是:send可以很輕松的在阻塞和非阻塞之間切換write雖然也可以在阻塞和非阻塞之間切換,但是操作比較復雜

6.通過套接字接收數據

ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:通過套接字 sockfd接受網絡中發來的數據
參數 sockfd、buf、len 和read一樣
參數 flags :有2個選項0:默認屬性,默認狀態下,recv和read一模一樣MSG_DONTWAIT:使read函數稱為一個非阻塞函數返回值:阻塞模式下:成功接受數據,返回接受到的數據的字節數,套接子損壞,返回-1當阻塞模式 變成非阻塞模式后,recv就會一直返回0當客戶端與服務器連接中的時候,recv函數默認是一個阻塞函數當客戶端與服務器斷開鏈接后,recv函數就會從阻塞模式瞬間變成非阻塞模式所以,我們可以通過recv函數的返回值,判斷,客戶端\服務器是否下線非阻塞模式下:成功接受數據,返回接受到的數據的字節數如果沒有數據可接受,返回0如何客戶端與服務器斷開鏈接,返回-1總結:recv對比read優點recv可以輕松的切換成非阻塞模式read稍微要花點功夫

7.tcp服務器創建流程

1.創建服務器套接字

int server = socket(AF_INET,SOCK_STREAM,0);

2.準備struct sockaddr_in 結構體

將ip 和 port提前放在結構體中

struct sockaddr_in addr = {0};addr.sin_family = AF_INET;	addr.sin_port = htons(port);addr.sin_addr.s_addr = inet_addr("0.0.0.0");

3.用bind函數講準備好的結構體中的信息寫入套接字

bind(server,(struct sockaddr*)&addr,sizeof(addr));

4.接收客戶端的連接

accept(server,(struct sockaddr*)&client_addr,&client_len);

5.用read/recv讀取客戶端發來的消息

6.用write/snd發送消息

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

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

相關文章

Go語言高并發聊天室(一):架構設計與核心概念

Go語言高并發聊天室(一):架構設計與核心概念 🚀 引言 在當今互聯網時代,實時通信已成為各類應用的核心功能。從微信、QQ到各種在線協作工具,高并發聊天系統的需求無處不在。本系列文章將手把手教你使用Go語…

Java基礎:泛型

什么是泛型? 簡單來說,Java泛型是JDK 5引入的一種特性,它允許你在定義類、接口和方法時使用類型參數(Type Parameters)。這些類型參數可以在編譯時被具體的類型(如 String, Integer, MyCustomClass 等&…

RMSNorm實現

當前Qwen、Llama等系列RMSNorm實現源碼均一致。具體現實如下: class RMSNorm(nn.Module):def __init__(self, hidden_size, eps1e-6):super().__init__()self.weight nn.Parameter(torch.ones(hidden_size))self.variance_epsilon epsdef forward(self, hidden_s…

智能Agent場景實戰指南 Day 11:財務分析Agent系統開發

【智能Agent場景實戰指南 Day 11】財務分析Agent系統開發 文章標簽 AI Agent,財務分析,LLM應用,智能財務,Python開發 文章簡述 本文是"智能Agent場景實戰指南"系列第11篇,聚焦財務分析Agent系統的開發。文章深入解析如何構建一個能夠自動處理財務報表…

人工智能安全基礎復習用:可解釋性

一、可解釋性的核心作用1. 錯誤檢測與模型改進發現模型的異常行為(如過擬合、偏見),優化性能。例:醫療模型中,可解釋性幫助識別誤診原因。2. 安全與可信性關鍵領域(醫療、軍事)需透明決策&#…

Qt:QCustomPlot類介紹

QCustomPlot的核心類就是QCustomPlot類。這個類繼承自QWidget,因此可以像其他QWidget一樣使用,比如放入布局中。QCustomPlot類基本結構一個QCustomPlot對象可以包含多個圖層(通過QCPLayer表示),通常使用默認圖層。它包…

Visual Studio 2022 上使用ffmpeg

目錄 1. 添加包含目錄 2. 添加庫目錄 3. 添加依賴項 4. 添加動態庫目錄 5. 測試 在解決方案中右擊項目名稱,彈出的窗口中選擇 "屬性"。 1. 添加包含目錄 "C/C" -> "常規" -> "附加包含目錄"中添加 ffmpeg中的…

Elasticsearch 線程池

Elasticsearch 線程池「每個線程池到底采用哪種實現策略」:Elasticsearch 線程池(ThreadPool)中 **所有內置線程池名稱的常量定義**。 每個字符串常量對應一個 **線程池的名字(name)**,也就是你在 Thread…

深入理解 Next.js API 路由:構建全棧應用的終極指南

Next.js 是一個強大的 React 框架,不僅支持服務端渲染(SSR)和靜態站點生成(SSG),還提供了內置的 API 路由功能,使開發者能夠輕松構建全棧應用。傳統的全棧開發通常需要單獨搭建后端服務&#xf…

【6.1.2 漫畫分布式事務技術選型】

漫畫分布式事務技術選型 🎯 學習目標:掌握架構師核心技能——分布式事務技術選型與一致性解決方案,構建高可靠的分布式系統 🎭 第一章:分布式事務模式對比 🤔 2PC vs 3PC vs TCC vs Saga 想象分布式事務就…

液冷智算數據中心崛起,AI算力聯動PC Farm與云智算開拓新藍海(二)

從算法革新到基礎設施升級,從行業滲透到地域布局,人工智能算力正以 “規模擴張 效率提升”雙輪驅動中國數字經濟轉型。中國智能算力規模將在 2025 年突破 1000 EFLOPS,2028 年達到 2781.9 EFLOPS,五年復合增長率 46.2%&#xff0…

《QtPy:Python與Qt的完美橋梁》

QtPy 是什么 在 Python 的廣袤編程宇宙中,當涉及到圖形用戶界面(GUI)開發,Qt 框架宛如一顆璀璨的明星,散發著獨特的魅力。而 QtPy,作為 Python 與 Qt 生態系統交互中的關鍵角色,更是為開發者們開…

ubuntu環境下調試 RT-Thread

調試 RT-Thread 下載源碼 github 搜索 RT-Thread 下載源碼 安裝 python scons 環境 你已經安裝了 kconfiglib,但 scons --menuconfig 仍然提示找不到它。這種情況通常是由于 Python 環境不一致 導致的:你在一個 Python 環境中安裝了 kconfiglib&#xff…

【數據結構初階】--順序表(二)

🔥個人主頁:草莓熊Lotso 🎬作者簡介:C研發方向學習者 📖個人專欄: 《C語言》 《數據結構與算法》《C語言刷題集》《Leetcode刷題指南》 ??人生格言:生活是默默的堅持,毅力是永久的…

Java中的方法傳參機制

1. 概述Java中的方法傳參機制分為兩種:值傳遞(Pass by Value) 和 引用傳遞(Pass by Reference)。然而,Java中所有的參數傳遞都是值傳遞,只不過對于對象來說,傳遞的是對象的引用地址的…

C++——this關鍵字和new關鍵字

一、this 關鍵字1. 什么是 this?this 是 C 中的一個隱式指針,它指向當前對象(即調用成員函數的對象),在成員函數內部使用,用于引用調用該函數的對象。每個類的非靜態成員函數內部都可以使用 this。使用 thi…

Python中類靜態方法:@classmethod/@staticmethod詳解和實戰示例

在 Python 中,類方法 (classmethod) 和靜態方法 (staticmethod) 是類作用域下的兩種特殊方法。它們使用裝飾器定義,并且與實例方法 (def func(self)) 的行為有所不同。1. 三種方法的對比概覽方法類型是否訪問實例 (self)是否訪問類 (cls)典型用途實例方法…

FastGPT革命:下一代語言模型的極速進化

本文深度解析FastGPT核心技術架構,涵蓋分布式推理、量化壓縮、硬件加速等前沿方案,包含完整落地實踐指南,助你掌握大模型高效部署的終極武器。引言:當大模型遭遇速度瓶頸2023年,ChatGPT引爆全球AI熱潮,但企…

Geant4 安裝---Ubuntu

安裝工具 C/C工具包 sudo apt install build-essentialCmake sudo apt install -y cmakeccmake sudo apt install -y cmake-curses-gui安裝Qt可視化工具(不需要可視化可以不安裝) sudo apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtcreator 安裝Ope…

Spring Boot中請求參數讀取方式

目錄 一、前言 二、六種參數讀取方式 1.RequestParam 2.PathVariable 3.RequestBody 4.RequestHeader 5.CookieValue 6.MatrixVariable 三、對比和搭配 1.適用方法類型及建議使用場景 2.建議使用的請求路徑注解 3. 多種參數同時使用 4.同一請求不同方案&#xff1f…