簡體   English   中英

如何確定linux控制消息中多個輔助消息的大小

[英]How to determine size for multiple ancillary messages in linux control messages

我嘗試一次通過 unix 套接字發送多個文件描述符。 這對於單個套接字沒有問題。 雖然當我嘗試用CMSG_NXTHDR附加另一個時,我得到一個空指針,表明我的緩沖區太短。 對於一個文件描述符,我用CMSG_SPACE計算了緩沖區大小,我假設我只需要乘以這個。 雖然這似乎還不夠。 我寫了一個簡短的測試程序來檢查這個:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>

int main(int argc, char *argv[])
{
    struct msghdr msg;

    if(argc != 2){
        return 1;
    }

    union {
        struct cmsghdr cmsghdr;
        char control[CMSG_SPACE(sizeof(int)) * atoi(argv[1])];
    } cmsgu;
    struct cmsghdr *cmsg;

    msg.msg_name = 0;
    msg.msg_namelen = 0;
    msg.msg_iov = 0;
    msg.msg_iovlen = 0;

    msg.msg_control = cmsgu.control;
    msg.msg_controllen = sizeof(cmsgu.control);

    cmsg = CMSG_FIRSTHDR(&msg);
    cmsg->cmsg_len = CMSG_LEN(sizeof(int));
    cmsg->cmsg_level = SOL_SOCKET;
    cmsg->cmsg_type = SCM_RIGHTS;
    *((int *)CMSG_DATA(cmsg)) = -1;

    cmsg = CMSG_NXTHDR(&msg, cmsg);
    fprintf(stderr, "%p\n", cmsg);
    return 0;
}

當我用 1 調用它時,它輸出一個預期的空指針。 盡管我的期望是,如果用 2 CMSG_NXTHDR調用它會返回一個有效的指針。 第一個工作值是 5(所以額外的 120 個字節)。 我認為CMSG_SPACE會處理這個問題。 有沒有辦法去計算所需的空間? 或者有沒有更直接的方法在一條消息中發送多個文件描述符?

看到這個問題和答案。 如果您將 memset() cmsgu 設置為 0,您的代碼應該可以工作。

但是(並回答您的第二個問題),如果您想傳遞多個文件描述符,您可以使用一個包含整數數組的cmsghdr 修改你的例子,

    int n = atoi(argv[1]);
    int myfds[n]; // use this later

    union {
        struct cmsghdr cmsghdr; // for alignment
        char control[CMSG_SPACE(sizeof(int) * n)]; // space for one message
    } cmsgu;
    struct cmsghdr *cmsg;

    memset(&cmsgu, 0, sizeof(cmsgu)); // as noted

    msg.msg_name = 0;
    msg.msg_namelen = 0;
    msg.msg_iov = 0;
    msg.msg_iovlen = 0;

    msg.msg_control = cmsgu.control;
    msg.msg_controllen = sizeof(cmsgu.control);

    cmsg = CMSG_FIRSTHDR(&msg);
    cmsg->cmsg_len = CMSG_LEN(sizeof(int) * n);
    cmsg->cmsg_level = SOL_SOCKET;
    cmsg->cmsg_type = SCM_RIGHTS;

    int *fdptr = (int *) CMSG_DATA(cmsg);
    memcpy(fdptr, myfds, sizeof(int) * n);

這與 cmsg(3) 手冊頁中的示例基本相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM