recvmsg函數的用法

recvmsg?是 Linux 網絡編程中用于接收消息的高級系統調用,支持復雜數據結構和輔助數據的接收,適用于 TCP/UDP/UNIX 域套接字等場景?。以下是其核心用法詳解:


?1. 函數原型與參數?

#include <sys/socket.h>
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
  • ?sockfd?
    套接字描述符,需預先通過?socket()?創建?。
  • ?msg?
    指向?msghdr?結構體的指針,用于存儲消息的元數據和緩沖區信息(見下文詳細解析)?。
  • ?flags?
    控制接收行為的標志位(如?MSG_PEEK?預覽數據、MSG_WAITALL?阻塞直到數據滿緩沖區)?。

?2.?msghdr?結構體詳解?

struct msghdr {void         *msg_name;       // 可選:發送方地址(UDP 適用)socklen_t     msg_namelen;    // 地址長度struct iovec *msg_iov;        // 分散/聚集 I/O 緩沖區數組size_t        msg_iovlen;     // 緩沖區數量void         *msg_control;    // 輔助數據(如文件描述符)size_t        msg_controllen; // 輔助數據長度int           msg_flags;      // 接收消息的標志(輸出參數)
};
?關鍵字段說明?
  • ?msg_iov?與?msg_iovlen?
    支持多緩沖區接收數據(分散讀取),通過?iovec?結構體數組實現:
    struct iovec {void  *iov_base;  // 緩沖區起始地址size_t iov_len;   // 緩沖區長度
    };
    
    示例:同時接收數據到?buf1?和?buf2?。
  • ?msg_control?與?msg_controllen?
    用于接收輔助數據(如 UNIX 域套接字傳遞的文件描述符),需配合?cmsghdr?結構體解析?。

?3. 典型應用場景?

?場景1:UDP 接收數據(帶發送方地址)?
struct sockaddr_in sender_addr;
struct msghdr msg = {0};
struct iovec iov;
char buf[1024];iov.iov_base = buf;
iov.iov_len = sizeof(buf);
msg.msg_name = &sender_addr;
msg.msg_namelen = sizeof(sender_addr);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;recvmsg(sockfd, &msg, 0);  // 接收數據并獲取發送方地址?:ml-citation{ref="3,5" data="citationList"}
?場景2:接收文件描述符(UNIX 域套接字)?
struct msghdr msg = {0};
struct iovec iov;
char buf?[8192];
int fd;  // 接收的文件描述符// 輔助數據緩沖區(需對齊)
union {struct cmsghdr cm;char control[CMSG_SPACE(sizeof(int))];
} control_un;iov.iov_base = buf;
iov.iov_len = sizeof(buf);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
msg.msg_control = control_un.control;
msg.msg_controllen = sizeof(control_un.control);recvmsg(sockfd, &msg, 0);// 解析輔助數據獲取文件描述符
struct cmsghdr *cmptr = CMSG_FIRSTHDR(&msg);
if (cmptr != NULL && cmptr->cmsg_type == SCM_RIGHTS) {fd = *((int *)CMSG_DATA(cmptr));  // 提取描述符?
}

?4. 標志位(flags)詳解?

標志作用
MSG_PEEK預覽數據但不從接收緩沖區移除(可重復讀取)?
MSG_WAITALL阻塞直到請求的字節數全部接收(TCP 適用)?
MSG_DONTWAIT非阻塞模式,無數據時立即返回?EAGAIN?
MSG_TRUNC若數據被截斷,通過?msg_flags?返回該標志(UDP 適用)?

?5. 錯誤處理?

  • ?返回值?
    成功時返回接收的字節數,失敗返回?-1?并設置?errno(如?EAGAINECONNRESET)?。
  • ?msg_flags?輸出?
    接收后可通過?msg.msg_flags?檢查附加標志(如?MSG_TRUNCMSG_CTRUNC)?。

?6. 性能與擴展性?

  • ?優勢?
    相比?recv/recvfromrecvmsg?支持多緩沖區和輔助數據,減少系統調用次數,提升效率?。
  • ?限制?
    復雜參數需謹慎處理,如?msg_control?緩沖區未對齊可能導致錯誤?。

此函數廣泛應用于高級網絡編程(如 SCTP 協議、容器通信)和進程間文件描述符傳遞?。

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

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

相關文章

24GSPS高速DA FMC子卡

單通道 16bit 12GSPS/ 12bit 15.5GSPS/ 8bit 24GSPS雙通道 16bit 6.2GSPS/ 12bit 7.75GSPS/ 8bit 12GS/sDAC FMC子卡基于TI公司的高速DAC數模轉換器DAC39RF12ACK和時鐘芯片LMX2594而設計的標準單槽位的FMC子卡。支持單通道模式或雙通道模式&#xff0c;單通道模式下提供16bit 1…

LabVIEW動態調用VI

該組LabVIEW程序演示4 種動態調用 VI 的實現方案&#xff0c;圍繞 HTTP GET 任務&#xff08;通過 URL 抓取數據&#xff09;&#xff0c;利用不同調用邏輯&#xff0c;適配多場景下的并行 / 串行執行需求&#xff0c;助力工程師靈活構建異步、并行化程序。各方案說明&#xff…

安裝單機版本Redis

部署操作:步驟一: 安裝Redis服務# 安裝redis操作 dnf install redis -y步驟二&#xff1a; 修改Redis相關配置vim /etc/redis/redis.conf # 83行附件&#xff0c; 修改為 * -::* 任意的服務都可以連接redis服務 bind * -::*#908行附近&#xff1a; 打開requirepass&#xff…

Java(Set接口和HashSet的分析)

Set 接口基本介紹:注意:取出的順序的順序雖然不是添加的順序&#xff0c;但是他的固定set接口的常用方法:和 List 接口一樣, Set 接口也是 Collection 的子接口&#xff0c;因此&#xff0c;常用方法和 Collection 接口一樣.set的遍歷方式:HashSet的全面說明:HashSet的暢通方法…

vscode不識別vsix結尾的插件怎么解決?

當VS Code無法識別.vsix文件時&#xff0c;可能是由于文件損壞、版本不兼容或安裝流程不正確導致的。以下是解決此問題的詳細步驟&#xff1a; 1. 確認文件完整性 重新下載.vsix文件&#xff1a;刪除現有文件&#xff0c;從可靠來源重新下載&#xff0c;確保下載過程未中斷。檢…

面試題:sql題一

SELECTp.product_id, -- 產品IDp.product_name, -- 產品名稱SUM(s.sale_qty * s.unit_price) AS sum_price, -- 年銷售總價YEAR(s.sale_date) AS year_date -- 銷售年份 FROM products p JOIN sales s ON p.product_id s.produ…

【React-Three-Fiber實踐】放棄Shader!用頂點顏色實現高性能3D可視化

在現代前端開發中&#xff0c;3D可視化已經成為提升用戶體驗的重要手段。然而&#xff0c;許多開發者在實現復雜視覺效果時&#xff0c;往往會首先想到使用Shader&#xff08;著色器&#xff09;。雖然Shader功能強大&#xff0c;但學習曲線陡峭&#xff0c;實現復雜度高。本文…

MSTP技術

一、STP/RSTP 的局限性STP&#xff08;生成樹協議&#xff09;和 RSTP&#xff08;快速生成樹協議&#xff09;存在一些明顯的局限&#xff0c;主要包括&#xff1a;所有 VLAN 共享一顆生成樹&#xff0c;這導致無法實現不同 VLAN 在多條 Trunk 鏈路上的負載分擔。例如&#xf…

[IMX][UBoot] 16.Linux 內核移植

目錄 1.修改 Makefile 2.新增配置文件 3.新增設備樹文件 4.新建編譯腳本 5.修改 CPU 頻率 6.EMMC 適配 7.網絡驅動適配 1.修改 Makefile 修改頂層 Makefile 中的架構信息 ARCH 和交叉編譯器 CROSS_COMPILE&#xff0c;修改后不需要在執行 make 時手動指定這兩個變量的值…

數據庫 × 緩存雙寫策略深度剖析:一致性如何保障?

前言 緩存&#xff0c;幾乎是現在互聯網項目中最常見的一種加速工具了。 通過緩存&#xff0c;我們能大幅提升接口響應速度&#xff0c;減少數據庫的訪問壓力&#xff0c;還能支撐各種復雜的業務功能&#xff0c;比如排行榜、風控系統、黑名單校驗等等。 不管你用的是本地緩存…

主流Java Redis客戶端深度對比:Jedis、Lettuce與Redisson性能特性全解析

&#x1f49d;&#x1f49d;&#x1f49d;歡迎蒞臨我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 持續學習&#xff0c;不斷…

AI問答系統完整架構規劃文檔

?? 目錄 現有代碼架構分析 AI核心組件缺口分析 完整技術架構設計 開發路線圖 技術實現要點 ??? 現有代碼架構分析 當前項目結構 ai問答/ ├── main.py # FastAPI服務入口,API路由 ├── model.py # 基礎LLM模型加載與推理 ├── rag.py …

圓柱電池自動分選機:全流程自動化檢測的革新之路

在新能源產業快速發展的背景下&#xff0c;圓柱電池作為動力電池和儲能領域的核心組件&#xff0c;其生產效率與質量把控至關重要。圓柱電池自動分選機的出現&#xff0c;通過全流程自動化檢測技術&#xff0c;為電池制造與分選環節提供了高效、精準的解決方案。傳統電池分選依…

leetcode 1695. 刪除子數組的最大得分 中等

給你一個正整數數組 nums &#xff0c;請你從中刪除一個含有 若干不同元素 的子數組。刪除子數組的 得分 就是子數組各元素之 和 。返回 只刪除一個 子數組可獲得的 最大得分 。如果數組 b 是數組 a 的一個連續子序列&#xff0c;即如果它等于 a[l],a[l1],...,a[r] &#xff0c…

netty的編解碼器,以及內置的編解碼器

一、編碼器和解碼器 1、什么是編碼和解碼 解碼常用于入站操作&#xff0c;將字節轉換為消息。編碼用于出站&#xff0c;將消息轉換為字節流 2、解碼器ByteToMessageDecoder和ReplayingDecoder&#xff0c;ReplayingDecoder擴展了ByteToMessageDecoder類&#xff0c;使得我們不必…

一個基于現代C++智能指針的優雅內存管理解決方案

目錄 問題陳述 (Problem Statement) 1.1 問題背景與動機1.2 問題復雜性分析1.3 傳統解決方案的局限性1.4 目標需求定義 預備知識 (Preliminaries) 2.1 C智能指針基礎2.2 循環引用問題詳解2.3 自定義刪除器2.4 引用計數機制深入理解 核心解決方案 (Core Solution) 3.1 設計思路…

LabVIEW單片機溫控

基于 LabVIEW 與單片機設計溫度控制系統&#xff0c;整合硬件電路、串口通信、控制算法及監控功能&#xff0c;適用于教學實驗及中小型設備溫控場景。系統以低成本實現高精度溫控&#xff0c;為同類控制系統設計提供參考。應用場景教學場景&#xff1a;作為自動化專業綜合實驗項…

【初識數據結構】CS61B中的最小生成樹問題

本教程總結CS61B 關于圖章節中的最小生成樹&#xff08;Minimum Spanning Trees, MST&#xff09;問題&#xff0c;以及對應的的算法什么是最小生成樹&#xff08;MST&#xff09; 考慮這樣一個問題&#xff0c;給你一個無向圖&#xff0c;你能不能找出這個圖中的一組邊&#x…

vue apk返回鍵不好使

在 Android 設備上&#xff0c;你可以通過監聽物理返回鍵來實現特定的邏輯。這可以通過在 Vue 組件中添加一個事件監聽器來實現&#xff1a;mounted() {this.$once(hook:beforeDestroy, () > {if (document.removeEventListener) {document.removeEventListener(backbutton,…

Ubuntu 22.04 安裝 MySQL 8.0 完整步驟文檔

1、安裝 1.1、下載 cd /usr/local/在 /usr/local/ 下執行&#xff0c;下載資源包&#xff0c;可以本地下載上傳 wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz1.2、解壓安裝 tar -Jxvf mysql-8.0.32-linux-glibc2.…