網絡編程之UDP廣播與粘包問題

一,廣播簡介

從上述講的例?中,不管是TCP協議還是UDP協議,都是”單播”, 就是”點對點”的進?通信,如果要對網絡里面的所有主機進?通信,實現”點對多”的通信,我們可以使用UDP中的?播通信。
理論上可以像播放電視節目?樣在整個Internet 上發送廣播數據,但是幾乎沒有路由器轉發廣播數據,所以,廣播程序只能應用在本地子網中。

廣播的特點:

1.?播需要有發送?和接收?,必須有?些線程在機器上監聽到來的數據。?播的缺點是如果有多個進程都發送?播數據,?絡就會阻塞,?絡性能便會受到影響。
2.?播發送不是循環給?絡中的每?個IP發送數據,而是給?絡中?個特定的IP發送信息,這個IP就是?播地址,?播發送方:使?setsockopt打開SO_BROADCAST, 設置廣播地址 255.255.255.255,設置?播端口號。廣播接收方:將套接字綁定到指定的廣播端口號, 監聽數據到來。
3.?播數據發送只能采?UDP協議,?播UDP與單播UDP的區別就是IP地址不同,?播使?廣播地址255.255.255.255,將消息發送到在同?廣播網絡上的每個主機。

廣播的實現:

發送方:
1.調用 setsockopt()?打開 SO_BROADCAST。
2.使用廣播地址 255.255.255.255。
3.設置廣播端口號,向局域網廣播消息。

接收方:
1.將套接字綁定到廣播端口。
2.監聽數據到來,處理接收的廣播消息。

注意:廣播通信只能使用 UDP 協議,區別在于目標 IP 使用廣播地址 255.255.255.255。

二,setsockopt()函數詳解

setsockopt和getsockopt用于對套接字進行配置,常用于開啟廣播功能。

#include <sys/types.h>
#include <sys/socket.h>int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

sock:套接字描述符。

level:選項所在協議層(如 SOL_SOCKET、IPPROTO_IP、IPPROTO_TCP)。

optname:選項名稱(常見如 SO_BROADCAST)。

optval:選項值。

optlen:選項長度。

常見選項:

INADDR_ANY (0.0.0.0):表示綁定本機所有網卡地址。

INADDR_BROADCAST (255.255.255.255):廣播地址,消息只在當前局域網有效。

三,粘包問題

1.什么是粘包?

在 TCP 通信中,發送方發送的多個小數據包可能會被合并到一起,接收方從緩沖區讀取時無法分辨消息邊界,這就是 粘包。

注意:UDP 不會發生粘包問題,因為它以報文為單位,每次 recv 只能讀取一個完整 UDP 包。

2.粘包產生原因

1.發送方為了提高效率,等待緩沖區滿再發送。

2.TCP 協議中的 Nagle 算法?會將多個小包合并成大包。

3.接收方處理不及時,導致多個包堆積在緩沖區中一起被讀出。

3.解決辦法

自定義報文格式:
使用 包頭 + 數據長度 + 數據內容?的格式來傳輸。

包頭:標識包的起始位置。
長度:告訴接收方應該讀取多少字節。
包尾:標識包的結束。

示例:

[包頭][數據長度][數據內容][包尾]

接收時:

先讀取包頭,判斷一個數據包的開始。根據數據長度讀取完整數據。處理完后繼續讀取下一個包。

4.UDP廣播示例代碼

發送端(send.c)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <unistd.h>int main() {int sock;struct sockaddr_in broadcastAddr;char *msg = "Hello, this is a UDP broadcast!";int broadcastPermission = 1;// 創建 UDP 套接字sock = socket(AF_INET, SOCK_DGRAM, 0);if (sock < 0) {perror("socket failed");exit(1);}// 設置套接字支持廣播setsockopt(sock, SOL_SOCKET, SO_BROADCAST,&broadcastPermission, sizeof(broadcastPermission));// 設置廣播地址memset(&broadcastAddr, 0, sizeof(broadcastAddr));broadcastAddr.sin_family = AF_INET;broadcastAddr.sin_port = htons(8888);broadcastAddr.sin_addr.s_addr = inet_addr("255.255.255.255");// 發送廣播消息while (1) {sendto(sock, msg, strlen(msg), 0,(struct sockaddr *)&broadcastAddr, sizeof(broadcastAddr));printf("Broadcast message sent: %s\n", msg);sleep(2);}close(sock);return 0;
}

接收端(receive.c)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <unistd.h>#define BUF_SIZE 1024int main() {int sock;struct sockaddr_in recvAddr;char buffer[BUF_SIZE];socklen_t addr_len = sizeof(recvAddr);// 創建 UDP 套接字sock = socket(AF_INET, SOCK_DGRAM, 0);if (sock < 0) {perror("socket failed");exit(1);}// 綁定端口memset(&recvAddr, 0, sizeof(recvAddr));recvAddr.sin_family = AF_INET;recvAddr.sin_port = htons(8888);recvAddr.sin_addr.s_addr = htonl(INADDR_ANY);if (bind(sock, (struct sockaddr *)&recvAddr, sizeof(recvAddr)) < 0) {perror("bind failed");exit(1);}// 循環接收廣播while (1) {int recvLen = recvfrom(sock, buffer, BUF_SIZE, 0,(struct sockaddr *)&recvAddr, &addr_len);buffer[recvLen] = '\0';printf("Received broadcast: %s\n", buffer);}close(sock);return 0;
}

運行結果:

五,總結

1.DP 廣播適合局域網內的點對多通信,簡單高效。

2.使用 setsockopt()?配置 SO_BROADCAST,通過廣播地址 255.255.255.255?實現廣播。

3.TCP 粘包問題在通信中較常見,可以通過自定義報文格式來解決。

4.UDP 由于以報文為單位,不會產生粘包問題。

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

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

相關文章

教育領域大模型生成題目安全研究報告

教育領域大模型生成題目安全研究報告 一、研究背景與意義 隨著大語言模型&#xff08;LLM&#xff09;在教育領域的深度應用&#xff0c;自動生成題目已成為提升教學效率、實現個性化教學的關鍵技術手段&#xff0c;廣泛應用于課堂練習、作業布置、考試命題等場景。然而&…

Android安卓項目調試之Gradle 與 Gradle Wrapper的概念以及常用gradle命令深度詳解-優雅草卓伊凡

Android安卓項目調試之Gradle 與 Gradle Wrapper的概念以及常用gradle命令深度詳解-優雅草卓伊凡好的&#xff0c;我們來詳細梳理一下 Android 開發中 Gradle 的常用配置和調試命令。這對于每一位 Android 開發者來說都是必須掌握的核心技能。第一部分&#xff1a;Gradle 與 Gr…

Maven入門_簡介、安裝與配置

ZZHow(ZZhow1024) 參考課程&#xff1a; 【尚硅谷新版Maven教程】 [https://www.bilibili.com/video/BV1JN411G7gX] 一、Maven簡介 02_依賴管理工具 解決 jar 包的規模問題解決 jar 包的來源問題解決 jar 包的導入問題解決 jar 包之間的依賴 03_構建工具 我們沒有注意過…

Spark(1):不依賴Hadoop搭建Spark環境

不依賴Hadoop搭建Spark環境0 概述1 單機安裝Spark1.1 下載Spark預編譯包1.2 解壓和設置1.3 配置環境變量1.4 驗證安裝2 Spark運行模式2.1 Local模式&#xff08;本地模式&#xff09;2.1.1 Spark Shell2.1.1.1 Python版的Shell2.1.1.2 Scala版的Shell2.1.2 提交獨立的Spark應用…

【ThreeJs】【自帶依賴】Three.js 自帶依賴指南

&#x1f6e0;? Three.js 輔助庫生態手冊 定位&#xff1a;覆蓋 90% 開發場景的工具選型實操指南&#xff0c;區分「入門必備」和「進階擴展」。 適用人群&#xff1a;Three.js 新手&#xff08;≥ r132 版本&#xff09;、需要規范開發流程的團隊。 1. 控制器&#xff08;Co…

Mac電腦上如何打印出字體圖標

背景 我今天打開了一個之前開發的APP&#xff0c;看到項目中用到了字體圖標&#xff0c;發現有個“面條”圖標用錯了&#xff0c;想著修改一下吧。然后用輸入法打出”面條“&#xff0c;在輸入法的彈窗中就一直往下找&#xff0c;發現并沒有出現圖標。 想著打出”面條圖標“也沒…

當AI遇上數據庫:Text2Sql.Net如何讓“說人話查數據“成為現實

一句話概括&#xff1a;還在為寫復雜SQL而頭疼&#xff1f;Text2Sql.Net讓你用自然語言就能查數據庫&#xff0c;堪稱程序員的"數據庫翻譯官"&#xff01; &#x1f3af; 引言&#xff1a;從"SQL地獄"到"自然語言天堂" 想象一下這樣的場景&…

整體設計 之 緒 思維導圖引擎 之 引 認知系統 之8 之 序 認知元架構 之4 統籌:范疇/分類/目錄/條目 之2 (豆包助手 之6)

問題Q68、我們現在僅僅分析了 認知演進 的 “進”的問題&#xff0c;通過層次結構 和 統籌 的同構約束 給出了 不同對象及其對應的操作和約束。 --這句話 你能完全理解嗎&#xff08;這意味著 完整的程序細節設計&#xff09;。 還沒有分析的還有 “演” 以及組合詞 “演進” -…

開始 ComfyUI 的 AI 繪圖之旅-Qwen-Image-Edit(十二)

文章標題一、Qwen-Image-Edit1.ComfyOrg Qwen-Image-Edit 直播回放2.Qwen-Image-Edit ComfyUI 原生工作流示例2.1 工作流文件2.2 模型下載3.3 按步驟完成工作流一、Qwen-Image-Edit Qwen-Image-Edit 是 Qwen-Image 的圖像編輯版本&#xff0c;基于20B模型進一步訓練&#xff0c…

機械制造專屬ERP:降本增效與數字轉型的關鍵

轉型升級壓力下&#xff0c;ERP系統是機械企業破局的得力助手。本文深入解析ERP的核心功能、選型要點與實施價值&#xff0c;助您精準選型&#xff0c;賦能智能制造&#xff0c;全面提升競爭力。在數字化浪潮席卷之下&#xff0c;機械制造企業正面臨提質、增效、降本的關鍵轉型…

npm / yarn / pnpm 包管理器對比與最佳實踐(含國內鏡像源配置與緩存優化)

這篇不是“誰更快”的玄學討論,而是把團隊能落地的做法一次說清:如何選型、如何統一版本、如何把鏡像與緩存配好、如何在 CI 和 Monorepo 下穩住“可重復構建”。 一、結論先說在前 單倉庫 / 以穩定為先:直接用 npm(配合 npm ci) 足夠,維護成本低,生態一等一,Node 16.1…

Python項目全面打包指南:從EXE到綠色軟件包

?? Python項目全面打包指南:從EXE到綠色軟件包 文章目錄 ?? Python項目全面打包指南:從EXE到綠色軟件包 1 打包基礎概念與工具選型 1.1 核心打包概念 1.2 工具對比與選型 2 項目環境準備與依賴管理 2.1 創建和管理虛擬環境 2.2 依賴管理最佳實踐 2.3 依賴導出與規范文件處…

JAVA:Spring Boot 集成 FFmpeg 實現多媒體處理

1、簡述 在現代 Web 應用中,音視頻處理需求越來越常見,例如:視頻轉碼、截圖、音頻提取、格式轉換等。FFmpeg 是一個功能極其強大的開源音視頻處理工具,可以幫助我們高效完成這些任務。本文將介紹如何在 Spring Boot 項目中集成 FFmpeg,并實現一些常見的應用場景。 2、為什…

推薦一款智能三防手機:IP68+天璣6300+PoC對講+夜視

在戶外探險、工業巡檢及應急通信等專業領域&#xff0c;傳統智能手機往往難以應對復雜苛刻的環境挑戰。智能三防手機憑借其堅固的機身、專業的防護能力及定制化功能&#xff0c;成為眾多行業用戶的可靠工具。本文將深入解析一款集IP68防護、天璣6300處理器、PoC公網對講及夜視等…

ego(4)---檢測B樣條軌跡的障礙物進入點與退出點

障礙物進出點檢測的作用在經過 B 樣條的控制點采樣后&#xff0c;接下來是繞障的環節&#xff0c;繞障使用的是 Astar &#xff0c;但在使用 Astar 之前&#xff0c;需要進行障礙物進出點的檢測與標記。通俗點講&#xff0c;這部分的作用就是為 Astar 繞障礙做前置準備。檢測進…

在springboot中使用mock做controller層單元測試,請求示例包括GET(帶參數)、POST(帶請求頭)、下載文件、上傳文件等

以下是SpringBoot中使用MockMvc進行Controller層單元測試的完整示例,涵蓋GET帶參數、POST帶請求頭、文件下載和文件上傳等場景: GET請求測試(帶路徑參數) @Test void testGetWithPathParam() throws Exception {mockMvc.perform(MockMvcRequestBuilders.

領碼SPARK融合平臺 · TS × Java 雙向契約:構建穩定可演進的全棧系統——落地篇|配置即契約,守衛即護欄

系列總引 本系列致力于構建可復制、可演進的低代碼平臺類型治理閉環&#xff0c;從原理到落地、AI 驅動到性能治理。落地篇聚焦工程實踐&#xff0c;通過“契約單源 → 自動生成 → 前后端守衛協同 → CI/CD 管控”的完整流水線&#xff0c;將原理篇的類型方法論落到生產環境中…

Gradio全解11——Streaming:流式傳輸的視頻應用(8)——Gemini Live API:實時音視頻連接

Gradio全解11——Streaming&#xff1a;流式傳輸的視頻應用&#xff08;8&#xff09;——Gemini Live API&#xff1a;實時音視頻連接11.8 Gemini Live API&#xff1a;實時音視頻連接11.8.1 Live API——入門1. Live API技術與功能介紹2. 選擇音頻生成架構和實施方案3. 異步發…

事務學習總結

目錄 事務四大特性 事務四種隔離級別 事務七種傳播行為 事務四大特性 原子性Atomicity 要么同時成功&#xff0c;要么同時失敗。事務一旦發生失敗就會回滾到原來最初的樣子&#xff0c;仿佛沒有發生過一樣 一致性Consistency 事務處理前后&#xff0c;數據完整性要保持一…

JavaWeb--day4--WebHttp協議Tomcat

&#xff08;以下內容全部來自上述課程及課件&#xff09; 這里maven我學過了&#xff0c;可見&#xff1a;Maven項目管理–基礎篇&#xff0c;所以跳過 SpringBootWeb 1. 需求 需求&#xff1a;基于SpringBoot的方式開發一個web應用&#xff0c;瀏覽器發起請求/hello后&…