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

首頁 > 系統(tǒng) > Unix > 正文

UNIX網(wǎng)絡(luò)編程讀書筆記:recvmsg和sendmsg函數(shù)

2024-06-28 13:27:21
字體:
供稿:網(wǎng)友
UNIX網(wǎng)絡(luò)編程讀書筆記:recvmsg和sendmsg函數(shù)

這兩個函數(shù)是最通用的I/O函數(shù)。實際上我們可以把所有read、readv、recv和recvfrom調(diào)用替換成recvmsg調(diào)用。類似地,各種輸出函數(shù)調(diào)用也可以替換成sendmsg調(diào)用。

#include <sys/socket.h>ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);ssize_t sendmsg(int sockfd, struct msghdr *msg, int flags);返回:讀入或?qū)懗鲎止?jié)數(shù)——成功;-1——出錯

這兩個函數(shù)把大部分參數(shù)封裝到一個msghdr結(jié)構(gòu)中:

struct msghdr {    void            *msg_name;           /* PRotocol address */    socklen_t        msg_namelen;        /* size of protocol address */    struct iovec    *msg_iov;            /* scatter/gather array */    int              msg_iovlen;         /* # elements in msg_iov */    void            *msg_control;        /* ancillary data (cmsghdr struct) */    socklen_t        msg_controllen;     /* length of ancillary data */    int              msg_flags;          /* flags returned by recvmsg() */};

這里給出的msghdr結(jié)構(gòu)符合POSIX規(guī)范。有些系統(tǒng)仍然使用本結(jié)構(gòu)源自4.2BSD的較舊版本。這個較舊的結(jié)構(gòu)沒有msg_flags成員,而且msg_control和msg_controllen成員分別被稱為msg_accrights和msg_accrightslen。這個較舊結(jié)構(gòu)唯一支持的輔助數(shù)據(jù)形式用于傳遞文件描述字(稱為訪問權(quán)限)。

msg_name和msg_namelen這兩個成員用于套接口未連接的場合(譬如未連接UDP套接口)。它們類似reacvfrom和sendto的第5和第6個參數(shù):msg_name指向一個套接口地址結(jié)構(gòu),調(diào)用者在其中存放接收者(對于sendmsg調(diào)用)或發(fā)送者(對于recvmsg調(diào)用)的協(xié)議地址。如果無需指明協(xié)議地址(例如對于TCP套接口或已連接UDP套接口),msg_name應(yīng)置為空指針。msg_namelen對于sendmsg是一個值參數(shù),對于recvmsg卻是一個值-結(jié)果參數(shù)。

msg_iov和msg_iovlen這兩個成員指定輸入或輸出緩沖區(qū)數(shù)組(即iovec結(jié)構(gòu)數(shù)組),類似readv和writev的第2和第3個參數(shù)。

msg_control和msg_controllen這兩個成員指定可選的輔助數(shù)據(jù)的位置和大小。

對于recvmsg和sendmsg,我們必須區(qū)別它們的兩個標志變量:一個是傳遞值的flags參數(shù),另一個是所傳遞msghdr結(jié)構(gòu)的msg_flags成員,它傳遞的是引用,因為傳遞給函數(shù)的是該結(jié)構(gòu)的地址。

紅心只有recvmsg使用msg_flags成員。recvmsg被調(diào)用時,flags參數(shù)被拷貝到msg_flags成員,并由內(nèi)核使用其值驅(qū)動接收處理過程。內(nèi)核還依據(jù)recvmsg的結(jié)構(gòu)更新msg_flags成員的值。

紅心sendmsg忽略msg_flags成員,因為它直接使用flags參數(shù)驅(qū)動發(fā)送處理過程。這一點意味著如果想在某個sendmsg調(diào)用中設(shè)置MSG_DONTWAIT標志,那就把flags參數(shù)設(shè)置為該值;把msg_flags成員設(shè)置為該值不起作用。

如下圖所示,匯總了內(nèi)核為相關(guān)輸入和輸出函數(shù)檢查的flags參數(shù)值以及recvmsg可能返回的msg_flags成員值。其中沒有sendmsg msg_flags一欄,因為本組合無效。

標志 內(nèi)核檢查: send flags sendto flags sendmsg flags 內(nèi)核檢查: recv flags recvfrom flags recvmsg flags 內(nèi)核返回: recvmsg msg_flags
MSG_DONTROUTE MSG_DONTWAIT MSG_PEEK MSG_WAITALL          太陽          太陽           太陽           太陽           太陽
MSG_EOR MSG_OOB          太陽          太陽           太陽               太陽               太陽
MSG_BCAST MSG_MCAST MSG_TRUNC MSG_CTRUNC MSG_NOTIFICATION               太陽               太陽               太陽               太陽               太陽

這些標志中,內(nèi)核只檢查而不返回前4個標志;既檢查又返回下2個標志;不檢查而只返回后5個標志。recvmsg返回的7個標志解釋如下:

MSG_BCAST    本標志隨BSD/OS引入,相對較新。它的返回條件是:本數(shù)據(jù)報作為鏈路層廣播收取或者其宿ip地址是一個廣播地址。

MSG_MCAST    本標志隨BSD/OS引入,相對較新。它的返回條件是:本數(shù)據(jù)報作為鏈路層多播收取。

MSG_TRUNC    本標志的返回條件是:本數(shù)據(jù)報被截斷;也就是說,內(nèi)核預(yù)備返回的數(shù)據(jù)超過進程事先分配的空間(所有iov_len成員之和)。

MSG_CTRUNC  本標志的返回條件是:本數(shù)據(jù)報的輔助數(shù)據(jù)被截斷;也就是說,內(nèi)核預(yù)備返回的輔助數(shù)據(jù)超過進程事先分配的空間(msg_controllen)。

MSG_EOR        如果返回的數(shù)據(jù)不是一個邏輯記錄的結(jié)尾所在,本標志將清零;否則本標志將設(shè)置。TCP不使用本標志,因為它是一個字節(jié)流協(xié)議。

MSG_OOB       本標志絕不為TCP帶外數(shù)據(jù)返回。它用于其他協(xié)議族(例如OSI協(xié)議族)。

MSG_NOTIFICATION    本標志的返回條件是:SCTP接收端讀入的本消息是一個事件通知,而不是一個數(shù)據(jù)消息。

如下圖所示,展示了一個msghdr結(jié)構(gòu)以及它指向的各種信息。圖中假設(shè)進程即將對一個UDP套接口調(diào)用recvmsg。

image

圖中給協(xié)議地址分配了16個字節(jié),給輔助數(shù)據(jù)分配了20個字節(jié)。為緩沖數(shù)據(jù)初始化了3個iovec結(jié)構(gòu)構(gòu)成的數(shù)組:第一個指定一個100字節(jié)的緩沖區(qū),第二個指定一個60字節(jié)的緩沖區(qū),第三個指定一個80字節(jié)的緩沖區(qū)。我們還假設(shè)已為這個套接口設(shè)置了IP_RECVDSTADDR套接口選項,以接收所讀取UDP數(shù)報的宿IP地址。

我們接著假設(shè)從192.6.38.100端口2000到達一個170字節(jié)的UDP數(shù)據(jù)報,它的目的地是我們的UDP套接口,宿IP地址為206.168.112.96。如下圖所示,展示了recvmsg返回時msghdr結(jié)構(gòu)中的所有信息。(圖中被修改過的字段標了陰影)

image

紅心如下圖所示為5組I/O函數(shù)之間的差異:

image


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 久章草在线视频 | 国产一区二区视频观看 | 国产精品视频成人 | 九九爱视频| 色婷婷久久久 | 久久国产精品成人免费网站 | 久久免费视频7 | 精品国产乱码久久久久久久久 | 久久免费视频7 | 黄色毛片18| 黄色视频一级毛片 | 在线观看国产免费视频 | 久国产 | 欧美精品电影一区 | 日本在线视频免费观看 | 一区二区三区在线视频观看58 | 成人午夜小视频 | 日本精品婷婷久久爽一下 | 一级大片久久 | 久久国产夫妻视频 | 色综合视频 | 久久亚洲网 | 色播视频网站 | 久草在线精品观看 | 免费视频一区 | 国产亚洲精品视频中文字幕 | 国产一区二区视频在线播放 | 韩国精品视频在线观看 | 欧美日韩免费一区 | 色视频在线 | 久久草草亚洲蜜桃臀 | 成人午夜精品久久久久久久蜜臀 | 国产成人精品免费视频大全最热 | 色七七久久影院 | xnxx 日本19| 激情网站免费观看 | 国产乱子视频 | 日日鲁一鲁视频 | www国产成人免费观看视频,深夜成人网 | 国产成人高潮免费观看精品 | 毛片免费视频播放 |