1. 程式人生 > >sendmsg recvmsg函式

sendmsg recvmsg函式

sendmsg(2)與recvmsg(2)函式
這些函式為程式提供了一些其他的套介面I/O介面所不具備的高階特性。下面的內容我們將會先來看一下sendmsg來介紹這些主題。然後將會完整的介紹recvmsg函式,因為他們的函式介面是相似的。接下來,將會描述msghdr的完整結構。
sendmsg(2)函式
現在是時候進入這個大同盟了。從概念上說,sendmsg函式是所有寫入函式的基礎,而他是從屬於套介面的。下面的列表以複雜增加的順序列出了所有與入函式。在每一個層次上,同時列出了所增加的特性。
函式        增加的特性
write        最簡單的套介面寫入函式
send        增加了flags標記
sendto        增加了套介面地址與套介面長度引數
writev        沒有標記與套介面地址,但是具有分散寫入的能力
sendmsg        增加標記,套介面地址與長度,分散寫入以及附屬資料的能力
sendmsg(2)函式原型如下:
#include 
#include 
int sendmsg(int s, const struct msghdr *msg, unsigned int flags);
函式引數描述如下:
要在其上傳送訊息的套介面s
資訊頭結構指標msg,這會控制函式呼叫的功能
可選的標記位引數flags。這與send或是sendto函式呼叫的標記引數相同。
函式的返回值為實際傳送的位元組數。否則,返回-1表明發生了錯誤,而errno表明錯誤原因。
recvmsg(2)函式
recvmsg是與sendmsg函式相對的函式。這個函式原型如下:
#include 
#include 
int recvmsg(int s, struct msghdr *msg, unsigned int flags);
函式引數如下:
要在其上接收資訊的套介面s
資訊頭結構指標msg,這會控制函式呼叫的操作。
可選標記位引數flags。這與recv或是recvfrom函式呼叫的標記引數相同。
這個函式的返回值為實際接收的位元組數。否則,返回-1表明發生了錯誤,而errno表明錯誤原因。
理解struct msghdr
當我第一次看到他時,他看上去似乎是一個需要建立的巨大的結構。但是不要怕。其結構定義如下:
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;
};
結構成員可以分為四組。他們是:
套介面地址成員msg_name與msg_namelen。
I/O向量引用msg_iov與msg_iovlen。
附屬資料緩衝區成員msg_control與msg_controllen。
接收資訊標記位msg_flags。
在我們將這個結構分為上面的幾類以後,結構看起來就不那樣巨大了。
成員msg_name與msg_namelen
這些成員只有當我們的套介面是一個數據報套介面時才需要。msg_name成員指向我們要傳送或是接收資訊的套介面地址。成員msg_namelen指明瞭這個套介面地址的長度。
當呼叫recvmsg時,msg_name會指向一個將要接收的地址的接收區域。當呼叫sendmsg時,這會指向一個數據報將要傳送到的目的地址。
注意,msg_name定義為一個(void *)資料型別。我們並不需要將我們的套介面地址轉換為(struct sockaddr *)。
成員msg_iov與msg_iovlen
這些成員指定了我們的I/O向量陣列的位置以及他包含多少項。msg_iov成員指向一個struct iovec陣列。我們將會回憶起I/O向量指向我們的緩衝區。成員msg_iov指明瞭在我們的I/O向量陣列中有多少元素。
成員msg_control與msg_controllen
這些成員指向了我們附屬資料緩衝區並且表明了緩衝區大小。msg_control指向附屬資料緩衝區,而msg_controllen指明瞭緩衝區大小。
成員msg_flags
當使用recvmsg時,這個成員用於接收特定的標記位(他並不用於sendmsg)。在這個位置可以接收的標記位如下表所示:
標記位        描述
MSG_EOR        當接收到記錄結尾時會設定這一位。這通常對於SOCK_SEQPACKET套介面型別十分有用。
MSG_TRUNC    這個標記位表明資料的結尾被截短,因為接收緩衝區太小不足以接收全部的資料。
MSG_CTRUNC    這個標記位表明某些控制資料(附屬資料)被截短,因為緩衝區太小。
MSG_OOB        這個標記位表明接收了帶外資料。
MSG_ERRQUEUE    這個標記位表明沒有接收到資料,但是返回一個擴充套件錯誤。
我們可以在recvmsg(2)與sendmsg(2)的man手冊頁中檢視更多的資訊。
附屬資料結構與巨集
recvmsg與sendmsg函式允許程式傳送或是接收附屬資料。然而,這些額外的資訊受限於一定的格式規則。這一節將會介紹控制資訊頭與程式將會用來管理這些資訊的巨集。

相關推薦

sendmsg recvmsg函式

sendmsg(2)與recvmsg(2)函式 這些函式為程式提供了一些其他的套介面I/O介面所不具備的高階特性。下面的內容我們將會先來看一下sendmsg來介紹這些主題。然後將會完整的介紹recvmsg函式,因為他們的函式介面是相似的。接下來,將會描述msghdr的完整結構。 sendmsg(2)函式 現在

linux網路程式設計之socket(十六):通過UNIX域套接字傳遞描述符和 sendmsg/recvmsg 函式

void send_fd(int sock_fd, int send_fd) {     int ret;     struct msghdr msg;     struct cmsghdr *p_cmsg;     struct iovec vec;     char cmsgbuf[CMSG_SPACE(

sendmsgrecvmsg 函式

1. 基礎介紹   最通用的I/O函式,只要設定好引數,read、readv、recv、recvfrom和write、writev、send、sendto等函式都可以對應換成這兩個函式來呼叫。同時,各種輸出函式呼叫也可以替換成sendmsg呼叫。 #include <sys

recv、recvfrom、recvmsg函式

轉載地址:https://blog.csdn.net/jiahehao/article/details/8858131 1. recv #include <sys/socket.h> ssize_t recv(int sockfd, void * buf, size_t nbytes

71-recvmsgsendmsg 函式

這兩個函式只適用於套接字描述符。read、readv、recv 和 recvfrom 能用的地方,recvmsg 都能使用,而且,recvmsg 能提供更多的功能。同樣的,各種 output 型別的函式都可以替換成 sendmsg 函式。 所以,recvmsg

高階套介面-(sendmsgrecvmsg)舉例

這幾天學習網路程式設計,踩了好多坑,網上這部分資料不多,例子也是抄來抄去。 sendmsg和recvmsg這兩個介面是高階套介面,這兩個介面支援一般資料的傳送和接收,還支援多緩衝區的報文傳送和接收(readv和sendv支援多緩衝區傳送和接收),還可以在報文中

Linux下send、sendto、sendmsg函式分析

to:指向存放接收端地址的區域,可以為NULL。 tolen:以上記憶體區的長度,可以為0。 msg:指向存放傳送訊息頭的記憶體緩衝,結構形態如下 struct msghdr {     void         *msg_name;          socklen_t     msg_namele

高階套介面-(sendmsgrecvmsg)

程序間傳遞描述符一 每個程序都擁有自己獨立的程序空間,這使得描述符在程序之間的傳遞變得有點複雜,這個屬於高階程序間通訊的內容,下面就來說說。順便把 Linux 和 Windows 平臺都講講。 Linux 下的描述符傳遞 Linux 系統系下,子程序會自動繼承父程序已開啟的描述符,實際應用中,可能父程序需要

傳奇腳本中 SendMsg 編號說明

class 傳奇 說話 blog 廣播 發送 clas 腳本 body 0 1 2 3 4 5 60對全服人說1、發送普通紅色廣播信息。 2、發送普通紅色廣播信息,並顯示NPC名稱。 3、發送普通紅色廣播信息,並人物NPC名稱。 4、在NPC頭頂,顯示普通

c理解提高(5)字串copy函式技術推演

#include <stdlib.h> #include <string.h> #include <stdio.h> void main01() { //通過棧的方式對資料進行拷貝 char a[] = "i am a student"; char b[6

c理解提高(3)程式的記憶體四區模型和函式呼叫模型

程式的記憶體四區模型 記憶體四區的建立流程 流程說明 1、作業系統把物理硬碟程式碼load到記憶體 2、作業系統把c程式碼分成四個區 3、作業系統找到main函式入口執行   各區元素分析 函式呼叫模型 基本原理

yolo v2 損失函式原始碼解讀

前提說明:     1, 關於 yolo 和 yolo v2 的詳細解釋請移步至如下兩個連結,或者直接看論文(我自己有想寫 yolo 的教程,但思前想後下面兩個連結中的文章質量實在是太好了_(:з」∠)_)         yo

SQL Server 字串函式

 在開發T-SQL時,經常會需要對字串進行各種各樣的操作,下面介紹常用的字串函式。 1、獲取字元的ASCII碼 ASCII     ASCII碼是對字元的標準編碼。要獲取字元的ASCII碼就可以通過呼叫ASCII函式來實現。     語法結構: ASCII(espression)   這裡的e

python中偏函式的應用

一、什麼是偏函式? (1)在Python的functools模組眾多的功能中,其中有一個就是偏函式,我們稱之為 partial function 模組的概念我們下一篇在細講。 (2)我們都聽過偏將軍吧,在三國時代的官制中,系將軍的輔佐,與裨將軍兩者都

C/C++程式設計教訓----函式內靜態類物件初始化非執行緒安全(C++11之前)

不少程式設計師在編寫程式的時候,會使用函式內靜態(static)變數,既能滿足函式內這個變數可以持久的記錄某些資訊,又使其訪問範圍的控制侷限於函式內。但函式內靜態類物件初始化是非執行緒安全的。 問題背景 在我們產品中對log4cxx做了一些簡單的封裝 (採用VS2005編譯),其中會

Python2.7 Print函式

Print函式的各種用法 一、基礎用法 1.print語句可以向螢幕上輸出指定的文字。 例如: print 'Hello World!' 2.print語句也可以跟上多個字串,用逗號“,”隔開,就可以連成一串輸出: ps:print會依次列印每個字串,遇到逗號“,”會

Linux串列埠程式設計詳解 linux串列埠相關設定函式

tcgetattr    函式用於獲取與終端相關的引數。引數fd為終端的檔案描述符,返回的結果儲存在termios 結構體中 http://baike.baidu.com/view/5644808.htm?fr=aladdin tcset

redis 有序集合(zset)函式

redis 有序集合(zset)函式   zAdd 命令/方法/函式 Adds the specified member with a given score to the sorted set stored at key. 增加一個或多個元素,如果該元素已經存在,更新它的socre值

C語言 trim函式實現

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> //去除尾部空格 char *rtrim(char *str) { if(str == N

Postgres中視窗函式lag以lead

sql中我們經常會用到聚合函式,聚合之後它會減少資料量,但是如果我們想把聚合之後的資料和原始資料同時展示出來,那麼我們需要用到視窗函式。 lag視窗函式通過條件把資料劃分成子類,在子類中進行排序 視窗函式的通用寫法 select name ,orderdate, cost, su