0

IEEE Std 1003.1-2008<sys/socket.h>部分不提供 CMSG_SPACE 或 CMSG_LEN 宏,而只是说:

辅助数据由一系列对组成,每个对由一个 cmsghdr 结构和一个数据数组组成。

是否有一种可移植的方式来分配没有 CMSG_SPACE 的辅助数据,或者在没有 CMSG_LEN 的情况下将辅助数据附加到消息中?该引用向我表明,单个缓冲区的大小(sizeof(struct cmsghdr)+ sizeof data)*nr_of_pairs(当然,每对数据可能会更改),每个cmgshdr.cmsglen = sizeof(struct cmsghdr) + sizeof data人和msg.msg_controllen = (sizeof(struct cmsghdr)+ sizeof data)*nr_of_pairsCMSG_SPACE/CMSG_LEN 的所有系统特定文档都表明可能存在对齐问题这种方式。

4

1 回答 1

1

好的,所以据我所知,我的猜测是如何分配通常不起作用(我无法让它在 Linux 上工作,我不得不改用 CMSG_SPACE/CMSG_LEN)。根据 rfc2292 第 4.2 节中的图表,我提出了 CMSG_SPACE 和 CMSG_LEN 的以下定义,我认为它们应该可以移植到符合 IEEE Std 1003.1-2008 的实现:

#include <stddef.h>
#include <sys/socket.h>

#ifndef CMSG_LEN
socklen_t CMSG_LEN(size_t len) {
        return (CMSG_DATA((struct cmsghdr *) NULL) - (unsigned char *) NULL) + len;
}
#endif

#ifndef CMSG_SPACE
socklen_t CMSG_SPACE(size_t len) {
        struct msghdr msg;
        struct cmsghdr cmsg;
        msg.msg_control = &cmsg;
        msg.msg_controllen =  ~0ULL; /* To maximize the chance that CMSG_NXTHDR won't return NULL */
        cmsg.cmsg_len = CMSG_LEN(len);
        return (unsigned char *) CMSG_NXTHDR(&msg, &cmsg) - (unsigned char *) &cmsg;
}
#endif

显然这应该用宏来完成,但我认为这说明了这个想法。这对我来说似乎真的很棘手,并且由于 CMSG_NXTHDR 中可能的大小检查,不能被推入编译时常量,所以可能下一个版本的 POSIX 应该定义 CMSG_SPACE 和 CMSG_LEN 因为任何使用辅助数据的程序都必须使用它们反正。

于 2012-09-06T01:01:31.427 回答