亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Unix > 正文

UNIX網絡編程讀書筆記:recvmsg和sendmsg函數

2024-06-28 13:27:21
字體:
來源:轉載
供稿:網友
UNIX網絡編程讀書筆記:recvmsg和sendmsg函數

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

#include <sys/socket.h>ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);ssize_t sendmsg(int sockfd, struct msghdr *msg, int flags);返回:讀入或寫出字節數——成功;-1——出錯

這兩個函數把大部分參數封裝到一個msghdr結構中:

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結構符合POSIX規范。有些系統仍然使用本結構源自4.2BSD的較舊版本。這個較舊的結構沒有msg_flags成員,而且msg_control和msg_controllen成員分別被稱為msg_accrights和msg_accrightslen。這個較舊結構唯一支持的輔助數據形式用于傳遞文件描述字(稱為訪問權限)。

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

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

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

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

紅心只有recvmsg使用msg_flags成員。recvmsg被調用時,flags參數被拷貝到msg_flags成員,并由內核使用其值驅動接收處理過程。內核還依據recvmsg的結構更新msg_flags成員的值。

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

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

標志 內核檢查: send flags sendto flags sendmsg flags 內核檢查: recv flags recvfrom flags recvmsg flags 內核返回: 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               太陽               太陽               太陽               太陽               太陽

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

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

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

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

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

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

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

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

如下圖所示,展示了一個msghdr結構以及它指向的各種信息。圖中假設進程即將對一個UDP套接口調用recvmsg。

image

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

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

image

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

image


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩综合视频在线观看| 久久久久久这里只有精品| 久久视频在线观看免费| 成人精品福利视频| 久久视频在线直播| 亚洲欧美国产视频| 国产精品久久久久久久7电影| 亚洲性日韩精品一区二区| 91在线观看免费高清完整版在线观看| 97精品视频在线| 久久久久久欧美| 成人免费视频网址| 亚洲精品电影网在线观看| 国产+成+人+亚洲欧洲| 国产精品久久久久久久久久三级| 久久人人爽人人爽人人片av高清| 日韩免费中文字幕| 国产亚洲欧美日韩一区二区| 亚洲免费一在线| 亚洲国产精品久久精品怡红院| 亚洲国产精品成人av| 久久久久久香蕉网| 亚洲一区中文字幕在线观看| 亚洲视频axxx| 在线播放日韩精品| 亚洲大胆美女视频| 久久久久久久久亚洲| 色悠久久久久综合先锋影音下载| 亚洲无亚洲人成网站77777| 欧洲成人免费aa| 亚洲综合社区网| 成人黄色在线观看| 欧美福利视频网站| 蜜臀久久99精品久久久久久宅男| 成人免费网站在线观看| 国产精品成人播放| 日韩精品中文字幕在线播放| 神马久久桃色视频| 欧美性xxxx在线播放| 国产精品第一第二| 欧美日韩国产中文字幕| 国产网站欧美日韩免费精品在线观看| 久久久久一本一区二区青青蜜月| 精品一区二区三区电影| 久久精品亚洲精品| 亚洲综合第一页| 午夜剧场成人观在线视频免费观看| 中文字幕亚洲综合久久筱田步美| 国产精品人成电影| 久久久久中文字幕2018| 亚洲影院在线看| 成人xvideos免费视频| 亚洲成年人在线| 91亚洲一区精品| 精品久久久免费| 欧美日韩福利在线观看| 91夜夜未满十八勿入爽爽影院| 丝袜美腿亚洲一区二区| 91沈先生作品| 久久久国产精品亚洲一区| 91麻豆桃色免费看| 日韩不卡中文字幕| 最近中文字幕mv在线一区二区三区四区| 国产精品免费电影| 久久国产加勒比精品无码| 亚洲第一精品夜夜躁人人躁| 影音先锋欧美在线资源| 国产成人精品av在线| 亚洲人成欧美中文字幕| 午夜剧场成人观在线视频免费观看| 欧美—级a级欧美特级ar全黄| 一个色综合导航| 中文字幕无线精品亚洲乱码一区| 国产精品偷伦免费视频观看的| 精品久久久91| 人人做人人澡人人爽欧美| 欧美极度另类性三渗透| 国产亚洲一区二区在线| 久久久999精品视频| 亚洲色图50p| 亚洲精品久久久久| 欧美亚州一区二区三区| 亚洲91精品在线观看| 啊v视频在线一区二区三区| 九九视频这里只有精品| 日韩视频免费中文字幕| 久久国产精品影片| 亚洲va男人天堂| 国产91热爆ts人妖在线| 日韩av一区在线| 欧美激情第一页xxx| 欧美大胆在线视频| 日韩精品一区二区视频| 亚洲成人黄色在线观看| 日本中文字幕成人| 亚洲成色999久久网站| 色综合视频一区中文字幕| 色老头一区二区三区在线观看| 色综合久久天天综线观看| 福利一区福利二区微拍刺激| 欧美黑人极品猛少妇色xxxxx| 伊人久久五月天| 欧美精品videos| 这里精品视频免费| 亚洲成人999| 国产精品影片在线观看| 97在线看免费观看视频在线观看| www.日韩.com| 51视频国产精品一区二区| 久久精品国产91精品亚洲| 亚洲成人av在线| 韩国一区二区电影| 亚洲xxx自由成熟| 亚洲精品大尺度| 亚洲男子天堂网| 久久精品电影一区二区| 麻豆精品精华液| 国产精品成人免费电影| 国模精品视频一区二区三区| 精品久久久久久电影| 欧美亚洲国产成人精品| 国产精品福利观看| 欧美福利小视频| 日韩av在线高清| 国产精品成人久久久久| 日韩在线视频免费观看| 自拍偷拍亚洲欧美| 国产精品永久免费在线| 福利视频一区二区| 成人国产精品一区二区| 日本久久久久久| 国产91精品久久久| 97在线观看视频| 色777狠狠综合秋免鲁丝| 亚洲成人黄色网| 色一情一乱一区二区| 美女国内精品自产拍在线播放| 日韩视频免费看| 亚洲偷熟乱区亚洲香蕉av| 日本国产欧美一区二区三区| 精品免费在线视频| 亚州精品天堂中文字幕| 国产一区二区三区中文| 亚洲欧美日本伦理| 中文字幕欧美专区| 亚洲资源在线看| 亚洲图片欧美午夜| 亚洲一区国产精品| 国产精品久久中文| 亚洲午夜色婷婷在线| 色伦专区97中文字幕| 久久久久久亚洲精品中文字幕| 77777亚洲午夜久久多人| 欧美大学生性色视频| 国产精品久久久久久久久久| 日韩av在线看| 久久久久久欧美| 国产狼人综合免费视频| 亚洲成人黄色网址| 91高清视频免费| 欧美日韩成人免费| 草民午夜欧美限制a级福利片| 日韩电影免费观看在线| 欧美网站在线观看|