Linux程式設計之recvmsg和sendmsg函式

2021-10-24 19:05:09 字數 1225 閱讀 2058

#include #include ssize_t send(int sockfd, const void *buf, size_t len, int flags);

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,

const struct sockaddr *dest_addr, socklen_t addrlen);

ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);

這兩個函式把大部分引數封裝到乙個 msghdr 結構體中:

struct msghdr ;
msg_iov 和 msg_iovlen 這兩個成員指定輸入或輸出緩衝區陣列(即iovec結構陣列),類似 readv 或 writev 的第二個和第三個引數。

msg_control 和 msg_controllen 這兩個成員指定可選的輔助資料的位置和大小。msg_controllen 對於 recvmsg 是乙個值-結果引數。

對於 recvmsg 和 sendmsg,必須區別它們的兩個標誌變數:

recvmsg 返回的 7 個標誌如下:

下圖展示了乙個 msghdr 結構以及它指向的各種資訊。圖中假設程序即將對乙個 udp 套接字呼叫 recvmsg:

圖中給協議位址分配了 16 個位元組,給輔助資料分配了 20 個位元組。為緩衝資料初始化了乙個由 3 個 iovec 結構構成的陣列:第乙個指定乙個 100 位元組的緩衝區,第二個指定乙個 60 位元組的緩衝區,第三個指定乙個 80 位元組的緩衝區。假設已為這個套接字設定了 ip_recvdstaddr 套接字選項,以接收所讀取 udp 資料報的目的 ip 位址。

假設從 198.38.100:2000 到達乙個 170 位元組的 udp 資料報,它的目的地是我們的 udp 套接字,目的 ip 位址為 206.168.112.96.下圖展示了 recvmsg 返回時 msghdr 結構中的所有資訊。

圖中被 recvmsg 修改過的字段標上了陰影。從第一幅圖到第二幅圖的變動包括以下幾點:

linux程式設計之mprotect

mmap 的第三個引數指定對記憶體區域的保護,由標記讀 寫 執行許可權的 prot read prot write 和 prot exec 按位與操作獲得,或者是限制沒有訪問許可權的 prot none。如果程式嘗試在不允許這些許可權的本地記憶體上操作,它將被 sigsegv 訊號 segmenta...

Linux程式設計之fork

fork 建立乙個子程序 建立失敗返回負值 同時會有不同的錯誤碼 errno eagain 系統程序個數限制 enomem 申請記憶體失敗 enosys 系統平台不支援 建立成功將會返回兩個值 0 子程序的返回值,說明當前程式在子程序執行 0 父程序的返回值,說明當前程式在父程序執行,返回值為生成子...

linux程式設計之檢視幫助

想要在linux下獨擋一面的程式設計,有一技能必須掌握,那就是檢視幫助。要檢視乙個命令的幫助有兩個方法 這兩種方式一般命令都會有其中一種形式,有些兩種形式都有,而它們的輸出也很類似,都會告訴你命令的用法和命令支援的選項,比如 g help man g 命令g help輸出中第一句就是 usage g...