網絡編程(套接字)

目錄

一、套接字

1、套接字的作用

2、關于TCP和UDP協議

1. TCP協議

2. UDP協議

3. 兩者的區別

2、套接字函數

1)函數 socket(創建套接字同文件描述符)

2)準備套接字用結構體

1. 套接字的結構體

2. 客戶端的套接字:

3. 服務器的套接字:

3)bind(以結構體向套接字中寫入 ip、port)

4)send / write(通過套接字發送數據)

5)recv / read(通過套接字接收數據)

6)fcntl(變更函數狀態:阻塞/非阻塞)


一、套接字

套接字在最初只是一種IPC通訊手段,在TCP協議出現,TCP協議使用套接字進行通信,因此我們常說的套接字都是應用于網絡通信,而早期只用于進程間通訊的則稱為域套接字

1、套接字的作用

專門用于網絡間通信的一種文件形式

該文件,包含了要交換的數據和通信雙方的 ip地址和 port端口號

ip地址和 port端口號需要我們自己添加到套接字中,并且不同的協議需要使用不同類型的套接字

2、關于TCP和UDP協議

TCP協議和UDP協議的套接字就是不同類型的

1. TCP協議

TCP協議是一個可靠的,連續的,基于字節流的協議,TCP具有流量控制功能,順序控制功能,應答重發功能,以確保在網絡不擁堵的時候,所有的數據都可以正確的發送

2. UDP協議

UDP協議由于非連續性,且沒有有效的應答手段,所以不可靠,很容易丟包

向前糾錯技術(后來各大廠商對UDP協議的更進,添加了校驗的方法)

udp協議在發送數據的時候,會選擇在發送 n 個數據的時候,匹配發送 m 個校驗包

比如說發送 3個數據的時候,匹配發送1個校驗包

最簡單的校驗包 = 1#數據報 + 2#數據報 + 3#數據報

比如說:發送了 1 ,2,3 這3個數據,此時,再發送一個校驗包,校驗包的值是 4

很明顯,在丟包率為 25% 的時候,3個包配一個校驗包,就能完全避免丟包

因為4個包里面丟一個,丟了校驗包完全無所謂

丟的是任意一個數據包,可以通過校驗包和其他數據包,恢復出丟失的數據是多少

依此類推:如果網絡波動變大,我們就需要配更多的校驗包,以保證丟包率減低,恢復率提高

3. 兩者的區別

TCP協議穩定性高,傳輸速度慢,UDP協議穩定性差,傳輸速度快

2、套接字函數

1)函數 socket(創建套接字同文件描述符)

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
功能:創建不同類型的套接字用文件描述符
參數 domain:套接字所依賴的網絡介質如果是 ipv4 就填入 AF_INET如果是 ipv6 就填入 AF_INET6如果是 域套接字 就填入 AF_LOCAL / AF_UNIX
參數 type:選擇套接字的類型SCOK_STREAM:字節流套接字傳輸數據,連續,可靠,雙向,數據量大SOCL_DGRAM:數據包套接字傳輸數據,不連續,不可靠,有長度要求,雙向
參數 protocol:選擇套接字所依賴的通信協議0:自動匹配,會根據參數 type 和參數 protocol 自動選擇合適的通信協議
返回值:返回創建套接字文件描述符一般來說:AF_INET + SOCK_STREAM + 0 ,最終創建的是 TCP 協議的套接字AF_INET + SOCK_DGRAM  + 0 ,最終創建的是 UDP 協議的套接字 

????????字節流的優點:允許發送無窮大的數據,會在內核中對數據做分割處理,但是由于連續發送,數據依然粘連在一起

? ? ? ? 字節流的缺點:由于數據是粘連的,因此接收端需要花費大量的時間處理數據

? ? ? ? 數據包的優點:數據不會粘連,發送幾次數據就是幾個數據包

? ? ? ? 數據包的缺點:發送的數據大小有上限,過大的數據需要手動分批次發送,還有丟包的風險

2)準備套接字用結構體

1. 套接字的結構體
struct sockaddr_in {__kernel_sa_family_t  sin_family; /* 依賴的網絡介質       */__be16        sin_port;           /* port端口號           */struct in_addr    sin_addr;       /* ip地址               */
};

? ? ? ? 127.0.0.1 是一個本地回環地址,不會經過網卡,專門用來在無網絡的情況下做本地測試,
抓包工具無法抓到這個 ip地址 的數據

2. 客戶端的套接字:

寫入 ip地址 的目的 是為了通過 ip地址,找到該客戶端想要連接的服務器

寫入 port端口號 的目的 是為了通過端口號,知道數據需要發送到服務器的哪個進程??

3. 服務器的套接字:

寫入 ip地址 的目的 是過濾掉不想接收的客戶端,選擇想要連接的客戶端

寫入 port端口號 的目的 是為了讓服務器知道要去哪個進程讀取接收到的數據

3)bind(以結構體向套接字中寫入 ip、port)

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:往套接字中寫入 ip地址 和 port端口號 (該操作被稱為為套接字命名)
參數 sockfd:填寫 套接字用文件描述法
參數 addr:通用套接字結構體指針,需要提前準備 struct sockaddr_in 類型的結構體
參數 addrlen:參數 addr 的字節長度

4)send / write(通過套接字發送數據)

#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:通過套接字,向套接字中指向的ip地址發送數據
參數 sockfd:填入 socket創建的套接字文件描述符
參數 buf:填入 要發送的數據的地址
參數 len:填入 要發送的字節的長度
參數 flag:設置函數的狀態 阻塞 / 非阻塞0    :默認阻塞,發送數據給目標,目標的接收區滿了,就會發送阻塞MSG_DONTWAIT:非阻塞,發送數據給目標,接收區滿了,丟棄新發送的數據
=======================================================================
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
用法基本一致,IO篇也有詳細介紹

5)recv / read(通過套接字接收數據)

#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:通過套接字,讀取套接字中ip地址所發送的數據
參數 sockfd:由socket創建的套接字文件描述符
參數 buf:將讀取到的數據存入buf所指向的連續地址(所指向的數組)
參數 len:所讀取數據的字節長度
參數 flags:設置函數的狀態 阻塞 / 非阻塞0    :默認阻塞,沒有接收到數據就阻塞MSG_DONTWAIT:非阻塞,沒有讀取到數據直接返回 0 
返回值:阻塞模式:返回接收到數據的字節數,若套接字損壞 返回 -1若服務器與客戶端連接斷開,則有阻塞函數變為非阻塞函數,并返回 0非阻塞模式:返回接收到數據的字節數,若服務器與客戶端斷開,返回 -1未接收到參數,則返回 0
=====================================================================
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
用法基本一致,IO篇也有詳細介紹

6)fcntl(變更函數狀態:阻塞/非阻塞)

#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );
功能:設置指定文件描述符的狀態,也就是flags屬性
參數 cmd:設置函數的功能 設置 flags 或 讀取 flagsF_SETFL:設置 fd 文件的 flags 屬性F_GETFL:獲取 fd 文件的 flags 屬性
不定參 ···:此處只有第一個數據是有效的僅當 cmd == F_SETFL 時,需要傳一個不定參作為 flags
返回值:當 cmd == F_SETFL 時,成功返回 0 ,失敗返回 -1當 cmd == F_GETFL 時,返回 flags ,失敗返回 -1

使用時要注意不要變更原有的狀態,因此盡可能追加flags值(若有需要替換原先的值,也可以換)

使用流程:
1、先獲取 fd 原有的 flags 屬性
2、對獲取到的 flags 屬性追加
3、將追加好的 flags 屬性,設置為 fd 的 flags 屬性

以標準輸入流為例

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

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

相關文章

R語言安裝包

# 在安裝過程中指定源地址 install.packages("RCurl", repos "https://mirrors.tuna.tsinghua.edu.cn/CRAN/") # 查看當前鏡像 options()$repos # 設置為中科大鏡像 options("repos" c(CRAN"https://mirrors.ustc.edu.cn/CRAN/")…

微服務引擎 MSE 及云原生 API 網關 2025 年 5 月產品動態

點擊此處&#xff0c;了解微服務引擎 MSE 產品詳情。

性能測試過程中監控linux服務器資源情況

文章目錄1. cpu使用情況&#xff08;1&#xff09;性能瓶頸類型CPU密集型瓶頸??I/O或等待瓶頸?&#xff08;2&#xff09;資源分配與競爭?資源爭用分析?虛擬化環境資源分配?&#xff08;3&#xff09;系統穩定性與異常??異常波動與毛刺??過熱降頻影響?&#xff08;4…

使用defineExpose暴露子組件的屬性和方法、頁面生命周期onLoad和onReady的使用

歡迎來到我的UniApp技術專欄&#xff01;&#x1f389; 在這里&#xff0c;我將與大家分享關于UniApp開發的實用技巧、最佳實踐和項目經驗。 專欄特色&#xff1a; &#x1f4f1; 跨平臺開發一站式解決方案 &#x1f680; 從入門到精通的完整學習路徑 &#x1f4a1; 實戰項目經…

新手必看!VSCodePyCharm 配置 OpenCV 超詳細教程(支持 Python 和 C++ 雙語言)

新手必看&#xff01;VSCode&PyCharm 配置 OpenCV 超詳細教程&#xff08;支持 Python 和 C 雙語言&#xff09; 適用對象&#xff1a;初學者&#xff0c;希望在 VSCode 與 PyCharm 兩款常用 IDE 中&#xff0c;學會配置并使用 OpenCV&#xff0c;分別實現 Python 與 C 環境…

PyTorch深度學習框架入門案例實戰

PyTorch深度學習框架詳解與實戰 1. PyTorch簡介與環境配置 1.1 安裝與導入 # 基礎導入 import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from torch.utils.data import DataLoader, TensorDataset import numpy as np import…

Spring Boot - Spring Boot 集成 MyBatis 分頁實現 手寫 SQL 分頁

一、準備階段 1、依賴引入 pom.xml <properties>...<postgresql.verison>42.5.6</postgresql.verison><mybatis.version>3.0.1</mybatis.version> </properties><dependencies>...<!-- postgresql 驅動 --><dependency>…

李宏毅《生成式人工智能導論》 | 第9講 AI Agent

文章目錄大模型未來趨勢&#xff1a;以大型語言模型打造的AgentAI Agent運行的可能原理有記憶的ChatGPT大模型未來趨勢&#xff1a;以大型語言模型打造的Agent 人類需要做多步驟的復雜任務&#xff0c;AI可以做到這件事嗎&#xff1f; 如果可以我們將其稱為AI Agent&#xff…

OCR 與 AI 圖像識別:協同共生的智能雙引擎

OCR 擅長提取圖像中的文字信息&#xff0c;但面對復雜背景、扭曲角度的圖片時&#xff0c;容易受干擾&#xff1b;AI 圖像識別能解析圖像場景、物體形態&#xff0c;卻難以精準捕捉文字細節 —— 兩者結合才能釋放最大價值。比如在票據處理中&#xff0c;AI 圖像識別先定位票據…

C# 按照主題的訂閱 按照類型的訂閱

安裝TinyPubSub庫&#xff0c;按照 主題發布訂閱using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Form…

當執行shell時,出現未預期的符號 `$‘\r‘‘ 附近有語法錯誤

1.當執行shell時&#xff0c;出現未預期的符號 $‘\r’’ 附近有語法錯誤 解決&#xff1a; linux下解決&#xff1a; 方案一&#xff1a; Linux下打開shell文件&#xff0c;用vi/vim命令打開腳本文件&#xff0c;輸入“:set fileformatunix”&#xff0c;回車&#xff0c;保存…

合作共贏|華望系統科技受邀出席杭州市基礎軟件和工業軟件產業技術聯盟成立大會

大會現場&#xff08;圖源官方&#xff09;2025年7月11日&#xff0c;在杭州市經濟和信息化局&#xff08;杭州市數字經濟局&#xff09;的指導下&#xff0c;杭州市基礎軟件與工業軟件產業技術聯盟成立大會暨工業軟件生態共性云平臺發布儀式在西電杭州研究院圓滿舉行。會上&am…

7.17 滑動窗口

lc523.同余定理兩個注意點同余定理&#xff1a;余數相同的兩個數&#xff0c;做差可被整除。--前綴和hash存mod&#xff0c;不可以用set&#xff0c;因為要保證len大于等于2&#xff0c;所以要存idx映射&#xff01;&#xff01;還有對于全選和全不選的兩個邊界&#xff0c;下標…

算法與前端的可訪問性

引言 可訪問性&#xff08;Accessibility, a11y&#xff09;是現代 Web 開發的核心&#xff0c;確保所有用戶&#xff0c;包括殘障人士&#xff0c;都能無障礙地使用應用。算法在優化前端性能的同時&#xff0c;也能通過高效的數據處理和交互邏輯提升可訪問性體驗。例如&#x…

使用token調用Spring OAuth2 Resource Server接口錯誤 insufficient_scope

1、場景 最近照著《Spring Security實戰》學習&#xff0c;學到第18章&#xff0c;使用Keycloak作為授權服務器&#xff0c;使用 org.springframework.boot:spring-boot-starter-oauth2-resource-server 實現資源服務器&#xff0c;調用資源服務器的接口返回403&#xff0c;具…

4. 觀察者模式

目錄一、現實應用場景二、初步實現2.1 實現方案12.2 實現方案2三、觀察者模式3.1 應用場景3.2 詳解3.3 實現3.4 設計類圖四、實現五、更多一、現實應用場景 教師的手機號改變之后要通知給所有學生如果有一個學生沒有通知到位就會產生遺漏如何自動完成 二、初步實現 2.1 實現…

es 啟動中的一些記錄

完整修復流程 bash # 1. 創建用戶主目錄(如果需要) mkdir -p /home/es8 chown es8:es8 /home/es8# 2. 變更 Elasticsearch 目錄所有權 chown -R es8:es8 /data/es/elasticsearch-8.17.2/# 3. 調整目錄和文件權限 chmod -R 755 /data/es/elasticsearch-8.17.2/ chmod 644 /d…

區塊鏈之拜占庭容錯算法——Practical Byzantine Fault Tolerance(PBFT)

實用拜占庭容錯算法&#xff08;PBFT&#xff09;是由 Barbara Liskov 和 Miguel Castro 于 90 年代末提出的一種共識算法。原論文鏈接如下&#xff1a; http://pmg.csail.mit.edu/papers/osdi99.pdf pBFT 被設計為在異步&#xff08;響應請求的時間沒有上限&#xff09;系統…

從電子管到CPU

在線verilog轉電路圖 簡單門電路 https://logic.ly/demo/ 數學基礎 普通邏輯 與自然語言關系緊密, 亞里士多德三段論,??穆勒五法 , 語言, 語義,概念,定義,辯論, 詐騙 等, 是文科類的邏輯。 離散數學 不連續數學 數理邏輯 命題邏輯與謂詞邏輯, 與數學推理關系緊密, 它…

Javase-8.數組的練習

1.查找數組中指定元素(二分查找)以升序數組為例, 二分查找的思路是先取中間位置的元素, 然后使用待查找元素與數組中間元素進行比較&#xff1a; 如果相等&#xff0c;即找到了返回該元素在數組中的下標 如果小于&#xff0c;以類似方式到數組左半側查找 如果大于&#xff0c;以…