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_pairsを含むことを示唆していますが、CMSG_SPACE/CMSG_LEN のシステム固有のドキュメントはすべて、配置の問題が発生する可能性があることを示唆しています。この方法。

4

1 に答える 1

1

OK、割り当て方法に関する私の推測から、一般的には機能しません(Linuxで機能させることができなかったため、代わりにCMSG_SPACE/CMSG_LENを使用する必要がありました)。rfc2292のセクション 4.2 の図に基づいて、IEEE Std 1003.1-2008 の準拠する実装に移植できると思われる CMSG_SPACE と CMSG_LEN の次の定義を思いつきました。

#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 に答える