辅助数据可以移植分配吗?

时间:2012-09-04 15:26:32

标签: sockets posix portability

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

  

辅助数据由一系列对组成,每对由a组成   cmsghdr结构后跟数据数组。

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

1 个答案:

答案 0 :(得分:1)

好的,所以从我可以告诉我的猜测,如何分配将无法正常工作(我无法让它在Linux上工作,我不得不使用CMSG_SPACE / CMSG_LEN)。根据{{​​3}}第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,因为任何使用辅助数据的程序都必须使用它们反正。