麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統 > Unix > 正文

UNIX網絡編程讀書筆記:輔助數據

2024-06-28 13:27:21
字體:
來源:轉載
供稿:網友
UNIX網絡編程讀書筆記:輔助數據

輔助數據(ancillary data)可通過調用sendmsg和recvmsg這兩個函數,使用msghdr結構中的msg_control和msg_controllen這兩個成員發送和接收。

輔助數據的另一個稱謂是控制信息(control information)。

image

輔助數據由一個或多個輔助數據對象(ancillary data object)構成,每個對象以一個定義在頭文件<sys/socket.h>中的cmsghdr結構開頭。

struct cmsghdr {    socketlen_t    cmsg_len;      /* length in bytes, including this structure */    int            cmsg_level;    /* originating PRotocol */    int            cmsg_type;     /* protocol-specific type */    /* followed by unsigned char msg_data[] */};

由msg_control指向的輔助數據必須為各個cmsghdr結構適當地對齊,如下所示為一種對齊方法:

union {          struct cmsghdr     cm;          char               control[CMSG_SPACE(sizeof(int))];}control_un;

如下圖所示,展示了在一個控制緩沖區中出現2個輔助數據對象的一個例子:

image

msg_control指向第一個輔助數據對象,輔助數據的總長度則由msg_controllen指定。每個對象開頭都是一個描述該對象的cmsghdr結構。在cmsg_type成員和實際數據之間可以有填充字節,從數據結尾處到下一個輔助數據對象之前也可以有填充字節。

注意,不是所有實現都支持在單個控制緩沖區中存放多個輔助數據對象。

如下圖所示,展示了通過一個UNIX域套接口傳遞描述字或傳遞憑證時所用的cmsghdr結構的格式。

image

既然由recvmsg返回的輔助數據可含有任意數目的輔助數據對象,為了對應用程序屏蔽可能出現的填充字節,頭文件<sys/socket.h>中定義了以下5個宏,以簡化對輔助數據的處理。

#include <sys/socket.h>#include <sys/param.h>    /* for ALIGN macro on many implementations */struct cmsghdr *CMSG_FIRSTHDR(struct msghdr *mhdrptr);返回:指向第一個cmsghdr結構的指針,無輔助數據時為NULLstruct cmsghdr *CMSG_NXTHDR(struct msghdr *mhdrptr, struct cmsghdr *cmsgptr);返回:指向下一個cmsghdr結構的指針,不再有輔助數據對象時為NULLunsigned char *CMSG_DATA(struct cmsghdr *cmsgptr);返回:指向與cmsghdr結構關聯的數據的第一個字節的指針unsigned int CMSG_LEN(unsigned int length);返回:給定數據量下存放到cmsg_len中的值unsigned int CMSG_SPACE(unsigned int length);返回:給定數據量下一個輔助數據對象總的大小

這些宏可以按照如下偽代碼形式使用:

struct msghdr    msg;struct cmsghdr    *cmsgptr;/* fill in msg structure *//* call recvmsg() */for(cmsgptr = CMSG_FIRSTHDR(&msg); cmsgptr != NULL; cmsgptr = CMSG_NXTHDR(&msg, cmsgptr)){    if(cmsgptr->cmsg_level == ... && cmsgptr->cmsg_type == ...)    {        u_char    *ptr;                ptr = CMSG_DATA(cmsgptr);        /* process data pointed to by ptr */    }}

CMSG_FIRSTHDR返回指向第一個輔助數據對象的指針,然而如果在msghdr結構中沒有輔助數據(或者msg_control為一個空指針,或者cmsg_len小于一個cmsghdr結構的大小),那就返回一個空指針。當控制緩沖區中不再有下一個輔助數據對象時,CMSG_NXTHDR也返回一個空指針。

CMSG_LEN和CMSG_SPACE的區別在于,前者不計輔助數據對象中數據部分之后可能的填充字節,因而返回的是用于存放在cmsg_len成員中的值,后者計上結尾處可能的填充字節,因而返回的是用于為輔助對象動態分配空間的大小值。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产91久久久 | 日韩视频一二区 | 久久久久国产一区二区三区不卡 | 久草在线视频免费播放 | 免费午夜视频 | 欧美一级黄色网 | 国产精品久久久久久久久久iiiii | 精品亚洲va在线va天堂资源站 | 99精品视频久久精品视频 | 国内精品伊人久久 | 欧美一级视屏 | 中文字幕观看 | 免费一级特黄欧美大片勹久久网 | 激情视频免费看 | 91精品国产乱码久久桃 | 日韩视频精品一区 | 精品国产一区二区三 | 国产一级在线看 | www.99久| 欧美成人性生活 | 久久思思爱| 亚洲最大中文字幕 | 九九热在线视频观看 | 中文字幕在线播放视频 | 黄色片网站免费看 | 蜜桃91丨九色丨蝌蚪91桃色 | 草久在线 | 在线观看网址av | 精品一区二区亚洲 | 国产在线色| 国产一级在线看 | 91九色福利 | 中文字幕天堂在线 | 在线日韩av电影 | 亚洲网在线| 欧美第1页| 一级黄色免费观看 | 国产成人av免费看 | 国产日韩在线观看视频 | 7m视频成人精品分类 | 国产又白又嫩又紧又爽18p |