日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UNIX网络编程读书笔记:辅助数据

發布時間:2025/3/13 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UNIX网络编程读书笔记:辅助数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

輔助數據由一個或多個輔助數據對象(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個輔助數據對象的一個例子:

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

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

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

既然由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成員中的值,后者計上結尾處可能的填充字節,因而返回的是用于為輔助對象動態分配空間的大小值。

轉載于:https://www.cnblogs.com/nufangrensheng/p/3607487.html

總結

以上是生活随笔為你收集整理的UNIX网络编程读书笔记:辅助数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。