TCP/IP函數——sendmsg

sendmsg() 是 POSIX 標準中一個高級套接字發送函數,屬于系統調用(由操作系統內核實現),定義在 <sys/socket.h> 頭文件中。它的核心特點是支持復雜消息結構,不僅能發送常規數據,還能附加控制信息(如輔助數據、IP 選項等),適用于 TCP、UDP 等多種協議,功能比 send()/sendto() 更靈活。

一、函數原型

#include <sys/socket.h>ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);

二、參數詳解

1. sockfd(套接字描述符)

類型:int
作用:已創建的套接字描述符(如通過 socket() 創建的 TCP 或 UDP 套接字)。
要求:若為 UDP 等無連接協議,需在 msg 中指定目標地址;若為 TCP 等已連接協議(通過 connect() 綁定),可省略地址。

2. msg(消息結構,核心參數)

類型:const struct msghdr *
作用:指向 struct msghdr 結構體,該結構體封裝了發送的數據、目標地址、控制信息等所有與消息相關的內容。

struct msghdr 結構體定義如下(不同系統可能略有差異,以 Linux 為例):

struct msghdr {void         *msg_name;       // 目標地址(可選,僅無連接協議需要)socklen_t     msg_namelen;    // 目標地址長度struct iovec *msg_iov;        // 數據緩沖區數組(常規數據)size_t        msg_iovlen;     // 數據緩沖區數量void         *msg_control;    // 控制信息緩沖區(輔助數據)size_t        msg_controllen; // 控制信息緩沖區大小int           msg_flags;      // 接收時的標志(發送時忽略)
};

各字段詳解:

在這里插入圖片描述

輔助結構:struct iovec(數據緩沖區)

-msg_iov 指向的 struct iovec 數組用于定義常規數據的緩沖區,結構如下:

struct iovec {void  *iov_base;  // 緩沖區起始地址(數據存放的內存位置)size_t iov_len;   // 緩沖區長度(要發送的字節數)
};
  • 作用:支持 “分散發送”—— 將多個不連續的緩沖區數據合并成一個消息發送(無需先手動拼接)。

輔助結構:控制信息(cmsghdr)

msg_control 指向的控制信息緩沖區用于存儲輔助數據,格式由 struct cmsghdr 定義:

struct cmsghdr {size_t cmsg_len;   // 控制信息的總長度(含頭部和數據)int    cmsg_level; // 協議級別(如 SOL_SOCKET、IPPROTO_IP)int    cmsg_type;  // 控制信息類型(如 SCM_RIGHTS 表示傳遞文件描述符)// 數據部分(緊跟在結構體后,需通過宏訪問)
};
  • 常見用途:
    通過 Unix 域套接字傳遞文件描述符(SCM_RIGHTS)。
    設置 IP 選項(如 IP_TTL 控制生存時間)。
    傳遞網絡接口索引(綁定特定網卡發送)。

3. flags(發送標志)

  • 類型:int
  • 作用:控制發送行為,與 send()/sendto() 的 flags 參數相同,可組合使用(通過按位或 |)。
  • 常見取值:
    0:默認行為。
    MSG_DONTROUTE:不經過路由表,僅在本地網絡發送。
    MSG_DONTWAIT:非阻塞發送(若套接字為阻塞模式,臨時轉為非阻塞)。
    MSG_NOSIGNAL:發送 TCP 數據時,若對方已關閉連接,不產生 SIGPIPE 信號。
    三、返回值
    成功:返回實際發送的字節數(僅計算 msg_iov 中的常規數據,不包含控制信息)。
    失敗:返回 -1,并設置 errno 表示錯誤原因(如 EBADF 表示套接字無效,EINVAL 表示參數錯誤)。

四、使用場景與示例

sendmsg() 因支持控制信息和分散發送,適合以下場景:

1.傳遞輔助數據(如文件描述符、IP 選項)。
2.發送分散在多個緩沖區的數據(避免手動拼接)。

4.1 用 sendmsg() 實現 UDP 數據發送,功能等同于 sendto():

#include <stdio.h>
#include <sys/socket.h>

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

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

相關文章

運動控制中的插值運動(插補運動):原理、實現與應用

在自動化設備中,從起點到終點的精準軌跡控制是核心需求。當目標軌跡是直線、圓弧或復雜曲線時,僅通過離散的目標點無法實現平滑運動,這就需要插值運動(Interpolation Motion)技術 —— 通過控制算法在已知路徑點之間計算出連續的中間點,使運動部件沿預定軌跡平滑移動。本…

GMT——用于人形全身控制的通用運動跟蹤:兩階段師生訓練框架下,全身基于單一策略,且自適應采樣、MoE架構

前言 如此文《KungfuBot——基于物理約束和自適應運動追蹤的人形全身控制PBHC&#xff0c;用于學習打拳或跳舞(即RL下的動作模仿和運控)》的開頭所說 如此&#xff0c;便關注到最新出來的三個工作 第一個是GMT: General Motion Tracking for Humanoid Whole-Body Control第二個…

matlab版本粒子群算法(PSO)在路徑規劃中的應用

基于粒子群優化&#xff08;PSO&#xff09;算法的路徑規劃 MATLAB代碼實現 1. 初始化環境和參數 % 初始化環境參數 mapSize [10, 10]; % 地圖大小 startPoint [1, 1]; % 起點 endPoint [9, 9]; % 終點 obstacles [3, 3; 5, 5; 7, 7]; % 障礙物位置% PSO參數 numParticles …

Go語言面試:傳值與傳引用的區別及選擇指南

在Go語言中&#xff0c;函數參數的傳遞方式有兩種&#xff1a;傳值&#xff08;pass-by-value&#xff09;和傳引用&#xff08;pass-by-reference&#xff09;。理解這兩種方式的區別及其適用場景&#xff0c;是成為Go語言開發高手的必備技能。本文將深入探討Go語言中傳值與傳…

數據無言,網關有聲 耐達訊自動化RS485轉Profinet讓千年液位數據“開口說話”

在能源行業的數字化轉型浪潮中&#xff0c;你是否曾面臨這樣的困境&#xff1a; 現場大量采用RS485接口的液位計&#xff0c;數據孤立如信息孤島&#xff0c;無法接入Profinet高速網絡&#xff1f; 模擬信號傳輸距離受限&#xff0c;抗干擾能力弱&#xff0c;導致液位測量誤差…

出口退稅新政大提速:企業如何抓住政策紅利,提升最高13%純利?

近年來&#xff0c;出口退稅政策的優化與升級&#xff0c;正在成為外貿企業提升資金周轉率和利潤率的關鍵。國家稅務總局發布的 2022年第9號公告&#xff08;簡稱“9號公告”&#xff09;落地執行已兩年&#xff0c;外貿行業普遍感受到退稅速度顯著加快&#xff0c;平均退稅周期…

使用pytorch創建/訓練/推理OCR模型

一、任務描述 從手寫數字圖像中自動識別出對應的數字&#xff08;0-9&#xff09;” 的問題&#xff0c;屬于單標簽圖像分類任務&#xff08;每張圖像僅對應一個類別&#xff0c;即 0-9 中的一個數字&#xff09; 1、任務的核心定義&#xff1a;輸入與輸出 輸入&#xff1a;28…

新啟航開啟深孔測量新紀元:激光頻率梳技術攻克光學遮擋,達 130mm 深度 2μm 精度

摘要&#xff1a;本文聚焦于深孔測量領域&#xff0c;介紹了一種創新的激光頻率梳技術。該技術成功攻克傳統測量中的光學遮擋難題&#xff0c;在深孔測量深度達 130mm 時&#xff0c;可實現 2μm 的高精度測量&#xff0c;為深孔測量開啟了新的發展篇章。關鍵詞&#xff1a;激光…

GEO優化推薦:AI搜索新紀元下的品牌內容權威構建

引言&#xff1a;AI搜索引擎崛起與GEO策略的戰略重心轉移2025年&#xff0c;以ChatGPT、百度文心一言、DeepSeek為代表的AI搜索引擎已深入成為公眾信息獲取的核心渠道。這標志著品牌營銷策略的重心&#xff0c;正從傳統的搜索引擎優化&#xff08;SEO&#xff09;加速向生成式引…

uniapp的上拉加載H5和小程序

小程序配置{"path": "list/course-list","style": {"navigationBarTitleText": "課程列表","enablePullDownRefresh": true,"onReachBottomDistance": 150}}上拉拉觸底鉤子onReachBottom() {var that …

【和春筍一起學C++】(四十)抽象數據類型

抽象數據類型&#xff08;abstract data type, ADT&#xff09;以通用的方式描述數據類型。C中類的概念非常適合于ADT方法。例如&#xff0c;C程序通過堆棧來管理自動變量&#xff0c;堆棧可由對它執行的操作來描述。可創建空堆棧&#xff1b;可將數據項添加到堆頂&#xff08;…

大文件斷點續傳解決方案:基于Vue 2與Spring Boot的完整實現

大文件斷點續傳解決方案:基于Vue 2與Spring Boot的完整實現 在現代Web應用中,大文件上傳是一個常見但具有挑戰性的需求。傳統的文件上傳方式在面對網絡不穩定、大文件傳輸時往往表現不佳。本文將詳細介紹如何實現一個支持斷點續傳的大文件上傳功能,結合Vue 2前端和Spring Bo…

LeNet-5:手寫數字識別經典CNN

配套講解視頻&#xff0c;點擊下方名片獲取20 世紀 90 年代&#xff0c;計算機已經能識別文本&#xff0c;但圖片識別很困難。比如銀行支票的手寫數字識別&#xff0c;傳統方法需要人工設計規則&#xff0c;費時費力且精度不高。 于是&#xff0c;Yann LeCun 及其團隊提出了 Le…

如何在 C# 中將文本轉換為 Word 以及將 Word 轉換為文本

在現代軟件開發中&#xff0c;處理文檔內容是一個非常常見的需求。無論是生成報告、存儲日志&#xff0c;還是處理用戶輸入&#xff0c;開發者都可能需要在純文本與 Word 文檔之間進行轉換。有時需要將文本轉換為 Word&#xff0c;以便生成結構化的 .docx 文件&#xff0c;使內…

Open SWE:重構代碼協作的智能范式——從規劃到PR的全流程自動化革命

在軟件開發的演進史上,工具鏈的每一次革新都深刻重塑著開發者的工作方式。LangChain AI推出的Open SWE,作為首個開源的異步編程代理,正在重新定義代碼協作的邊界——它不再僅僅是代碼生成工具,而是構建了從代碼庫分析、方案規劃、代碼實現到拉取請求創建的端到端自動化工作…

【ARDUINO】通過ESP8266控制電機【待測試】

需求 通過Wi-Fi控制Arduino驅動的3V直流電機。這個方案使用外部6V或9V電源&#xff0c;ESP8266作為Wi-Fi模塊&#xff0c;Arduino作為主控制器&#xff0c;L298N作為電機驅動器。 手機/電腦 (Wi-Fi客戶端) | | (Wi-Fi) | ESP8266 (Wi-Fi模塊, AT指令模式) | | (串口通信) | A…

cuda編程筆記(18)-- 使用im2col + GEMM 實現卷積

我們之前介紹了cudnn調用api直接實現卷積&#xff0c;本文我們探究手動實現。對于直接使用for循環在cpu上的實現方法&#xff0c;就不過多介紹&#xff0c;只要了解卷積的原理&#xff0c;就很容易實現。im2col 的核心思想im2col image to column把輸入 feature map 的每個卷積…

Loopback for Mac:一鍵打造虛擬音頻矩陣,實現跨應用音頻自由流轉

虛擬音頻設備創建 模擬物理設備&#xff1a;Loopback允許用戶在Mac上創建虛擬音頻設備&#xff0c;這些設備可被系統及其他應用程序識別為真實硬件&#xff0c;實現音頻的虛擬化傳輸。多源聚合&#xff1a;支持將麥克風、應用程序&#xff08;如Skype、Zoom、GarageBand、Logic…

深入解析Django重定向機制

概述 核心是一個基類 HttpResponseRedirectBase&#xff0c;以及兩個具體的子類 HttpResponseRedirect&#xff08;302 臨時重定向&#xff09;和 HttpResponsePermanentRedirect&#xff08;301 永久重定向&#xff09;。它們都是 HttpResponse 的子類&#xff0c;專門用于告訴…

【Java實戰?】從IO到NIO:Java高并發編程的飛躍

目錄一、NIO 與 IO 的深度剖析1.1 IO 的局限性1.2 NIO 核心特性1.3 NIO 核心組件1.4 NIO 適用場景二、NIO 核心組件實戰2.1 Buffer 緩沖區2.2 Channel 通道2.3 Selector 選擇器2.4 NIO 文件操作案例三、NIO2.0 實戰3.1 Path 類3.2 Files 類3.3 Files 類高級操作3.4 NIO2.0 實戰…