cmsg

Autres langues

Langue: ja

Version: 1998-10-02 (openSuse - 09/10/07)

Section: 3 (Bibliothèques de fonctions)

̾Á°

CMSG_ALIGN, CMSG_SPACE, CMSG_NXTHDR, CMSG_FIRSTHDR - Êä½õ¥Ç¡¼¥¿¤Ë¥¢¥¯¥»¥¹¤¹¤ë¡£

½ñ¼°

#include <sys/socket.h>

struct cmsghdr *CMSG_FIRSTHDR(struct msghdr *msgh);
struct cmsghdr *CMSG_NXTHDR(struct msghdr *msgh, struct cmsghdr *cmsg);
size_t CMSG_ALIGN(size_t length);
size_t CMSG_SPACE(size_t length);
size_t CMSG_LEN(size_t length);
unsigned char *CMSG_DATA(struct cmsghdr *cmsg);


struct cmsghdr {

    socklen_t cmsg_len;    /* data byte count, including header */

    int       cmsg_level;  /* originating protocol */

    int       cmsg_type;   /* protocol-specific type */

    /* followed by unsigned char cmsg_data[]; */

};

ÀâÌÀ

¤³¤ì¤é¤Î¥Þ¥¯¥í¤ÏÀ©¸æ¥á¥Ã¥»¡¼¥¸ (Êä½õ¥Ç¡¼¥¿ (ancillary data) ¤È¤â¸Æ¤Ð¤ì¤ë) ¤òºî¤ê¡¢ ¤½¤ì¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤¿¤á¤Ë»È¤ï¤ì¤ë¡£ À©¸æ¥á¥Ã¥»¡¼¥¸¤Ï¥½¥±¥Ã¥È¤Ë¤Î¤ë¥Ç¡¼¥¿¤Ç¤Ï¤Ê¤¤¡£ ¤³¤ÎÀ©¸æ¾ðÊó¤Ï¡¢ÅþÃ夷¤¿¥Ñ¥±¥Ã¥È¤Ø¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¡¢ÍÍ¡¹¤Ê¤¢¤Þ¤ê »È¤ï¤ì¤Ê¤¤¥Ø¥Ã¥À¡¼¥Õ¥£¡¼¥ë¥É¡¢¥¨¥é¡¼µ­½Ò¤Î³ÈÄ¥¡¢¥Õ¥¡¥¤¥ë¥Ç¥¹¥¯¥ê ¥×¥¿¤Î½¸¹ç¤ä¡¢Unix¤Ë¤ª¤±¤ë¿®Íê¾ðÊó (credential) ¤ò´Þ¤ó¤Ç¤¤¤ë¡£ À©¸æ¥á¥Ã¥»¡¼¥¸¤Ï¡¢Î㤨¤Ð IP ¥ª¥×¥·¥ç¥ó¤Î¤è¤¦¤ÊÄɲåإåÀ¡¼¥Õ¥£¡¼¥ë¥É¤ò Á÷¤ë¤Î¤Ë»È¤¦»ö¤¬¤Ç¤­¤ë¡£ Êä½õ¥Ç¡¼¥¿¤Ï¡¢ sendmsg(2) ¤ò¸Æ¤Ó½Ð¤·¤ÆÁ÷¤ê¡¢ recvmsg(2) ¤ò¸Æ¤Ó½Ð¤·¤Æ¼õ¤±¼è¤ë¡£ ¾ÜºÙ¤Ï¤½¤ì¤é¤Î¥Þ¥Ë¥å¥¢¥ë¥Ú¡¼¥¸¤ò»²¾È¡£

Êä½õ¥Ç¡¼¥¿¤Ï struct cmsghdr ¹½Â¤ÂΤΥ·¡¼¥±¥ó¥¹¤ËÄɲåǡ¼¥¿¤¬Éղ䵤줿¤â¤Î¤Ç¤¢¤ë¡£ ¤³¤Î¥·¡¼¥±¥ó¥¹¤Ë¤Ï¤³¤Î¥Þ¥Ë¥å¥¢¥ë¥Ú¡¼¥¸¤Ë½ñ¤«¤ì¤Æ¤¤¤ë ¥Þ¥¯¥í¤ò»È¤Ã¤Æ¥¢¥¯¥»¥¹¤¹¤Ù¤­¤Ç¡¢Ä¾ÀÜ¥¢¥¯¥»¥¹¤¹¤Ù¤­¤Ç¤Ï¤Ê¤¤¡£ »ÈÍѲÄǽ¤ÊÀ©¸æ¥á¥Ã¥»¡¼¥¸¤Î¥¿¥¤¥×¤Ë¤Ä¤¤¤Æ¤Ï¡¢ ¤½¤ì¤¾¤ì¤Î¥×¥í¥È¥³¥ë¤Î¥Þ¥Ë¥å¥¢¥ë¥Ú¡¼¥¸¤ò»²¾È¤Î¤³¤È¡£ ÀܳËè¤ÎºÇÂçÊä½õÍѥХåե¡¥µ¥¤¥º¤Ï net.core.optmem_max sysctl ¤ò»È¤Ã¤ÆÀßÄê¤Ç¤­¤ë¡£ socket(7) ¤ò»²¾È¡£

CMSG_FIRSTHDR() ¤Ï¡¢ÅϤ·¤¿ msghdr ¤Ë´ØÏ¢¤·¤¿Êä½õ¥Ç¡¼¥¿¥Ð¥Ã¥Õ¥¡Ãæ¤Î¡¢ºÇ½é¤Î cmsghdr ¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£

CMSG_NXTHDR() ¤Ï¡¢ÅϤ·¤¿ cmsghdr ¤Î¼¡¤Ë¤¯¤ë (Í­¸ú¤Ê) cmsghdr ¤òÊÖ¤¹¡£ ¥Ð¥Ã¥Õ¥¡¤Ë½½Ê¬¤Ê¶õ¤­¤¬Ìµ¤¤¾ì¹ç¡¢NULL ¤òÊÖ¤¹¡£

CMSG_ALIGN() ¤ËŤµ¤òÍ¿¤¨¤ë¤È¡¢É¬Íפʥ¢¥é¥¤¥ó¥á¥ó¥È¤ò²ÃÌ£¤·¤¿Ä¹¤µ¤òÊÖ¤·¤Æ¤¯¤ë¡£ ¤³¤ì¤ÏÄê¿ô¼°¤Ç¤¢¤ë¡£

CMSG_SPACE() ¤Ï¡¢Í¿¤¨¤¿¥Ç¡¼¥¿Ä¹¤¬Àê¤á¤ë¤Î¤ËɬÍפÊÊä½õÍ×ÁÇ (ancillary element) ¤Î ¥Ð¥¤¥È¿ô¤òÊÖ¤¹¡£¤³¤ì¤ÏÄê¿ô¼°¤Ç¤¢¤ë¡£

CMSG_DATA() ¤Ï¡¢ cmsghdr ¤Î¥Ç¡¼¥¿Éôʬ¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£

CMSG_LEN() ¤Ï¡¢ cmsghdr ¹½Â¤ÂΤΠcmsg_len ¥á¥ó¥Ð¤Ë¥Ç¡¼¥¿¤ò³ÊǼ¤¹¤ëºÝ¤ËɬÍפÊÃͤòÊÖ¤¹¡£¥¢¥é¥¤¥ó¥á¥ó¥È¤â¹Íθ¤ËÆþ¤ì ¤é¤ì¤ë¡£ °ú¿ô¤È¤·¤Æ¥Ç¡¼¥¿Ä¹¤ò¤È¤ë¡£¤³¤ì¤ÏÄê¿ô¼°¤Ç¤¢¤ë¡£

Êä½õ¥Ç¡¼¥¿¤òºî¤ë¤¿¤á¤Ë¤ÏºÇ½é¤Ë msghdr ¤Î¥á¥ó¥Ð¡¼ msg_controllen ¤ò¡¢À©¸æ¥á¥Ã¥»¡¼¥¸¥Ð¥Ã¥Õ¥¡¤ÎŤµ¤Ç½é´ü²½¤¹¤ë¡£ CMSG_FIRSTHDR() ¤ò msghdr ¤ËÍѤ¤¤ë¤ÈºÇ½é¤ÎÀ©¸æ¥á¥Ã¥»¡¼¥¸¤¬ÆÀ¤é¤ì¡¢ CMSG_NEXTHDR ¤ò»È¤¦¤È¼¡¤ÎÀ©¸æ¥á¥Ã¥»¡¼¥¸¤¬ÆÀ¤é¤ì¤ë¡£ ¤½¤ì¤¾¤ì¤ÎÀ©¸æ¥á¥Ã¥»¡¼¥¸¤Ç¤Ï¡¢ cmsg_len ¤ò½é´ü²½¤¹¤ë ( CMSG_LEN() ¤ò»È¤¦)¡£ ¤½¤Î¾¤Î cmsghdr ¥Ø¥Ã¥À¡¼¥Õ¥£¡¼¥ë¥É¡¢¤½¤·¤Æ¥Ç¡¼¥¿Éôʬ¤ËÂФ·¤Æ¤â CMSG_DATA() ¤ò»È¤Ã¤Æ½é´ü²½¤ò¤¹¤ë¡£ ºÇ¸å¤Ë msghdr ¤Î msg_controllen ¥Õ¥£¡¼¥ë¥É¤Ë¡¢¥Ð¥Ã¥Õ¥¡Ãæ¤ÎÀ©¸æ¥á¥Ã¥»¡¼¥¸¤ÎŤµ¤Î CMSG_SPACE() ¤Î¹ç·×¤¬¥»¥Ã¥È¤µ¤ì¤ë¡£ msghdr ¤Ë¤Ä¤¤¤Æ¤Î¾ÜºÙ¤Ï recvmsg(2) ¤ò»²¾È¡£

À©¸æ¥á¥Ã¥»¡¼¥¸¥Ð¥Ã¥Õ¥¡¤¬Á´¤Æ¤Î¥á¥Ã¥»¡¼¥¸¤òǼ¤á¤ë¤Î¤Ë¤Ïû¤¹¤®¤ë¾ì¹ç¡¢ msghdr ¤Î msg_flags ¥á¥ó¥Ð¡¼¤Ë MSG_CTRUNC ¥Õ¥é¥°¤¬¥»¥Ã¥È¤µ¤ì¤ë¡£

½àµò

¤³¤ÎÊä½õ¥Ç¡¼¥¿¥â¥Ç¥ë¤Ï¡¢POSIX.1g draft, 4.4BSD-Lite, RFC 2292 ¤Ë µ­½Ò¤µ¤ì¤Æ¤¤¤ë IPv6 advanced API, ¤½¤·¤Æ SUSv2 ¤Ë½àµò¤·¤Æ¤¤¤ë¡£ CMSG_ALIGN ¤Ï Linux ¤Î³ÈÄ¥¤Ç¤¢¤ë¡£

Ãí°Õ

°Ü¿¢À­¤Î¤¿¤á¤Ë¡¢Êä½õ¥Ç¡¼¥¿¤Ø¤Î¥¢¥¯¥»¥¹¤Ë¤Ï¡¢ ¤³¤³¤Ç½Ò¤Ù¤é¤ì¤Æ¤¤¤ë¥Þ¥¯¥í¤ò»È¤¦¤À¤±¤Ë¤¹¤Ù¤­¤Ç¤¢¤ë¡£ CMSG_ALIGN() ¤Ï Linux ¤Ç¤Î³ÈÄ¥¤Ç¤¢¤ê¡¢°Ü¿¢À­¤ò¹Í¤¨¤¿¥×¥í¥°¥é¥à¤Ç¤Ï»È¤¦¤Ù¤­¤Ç¤Ï¤Ê¤¤¡£

Linux ¤Ç¤Ï CMSG_LEN(), CMSG_DATA(), CMSG_ALIGN() ¤ÏÄê¿ô¼°¤Ç¤¢¤ë (¤½¤ì¤é¤Î°ú¿ô¤¬Äê¿ô¤È¤ß¤Ê¤µ¤ì¤ë)¡£ ¤³¤Î¤³¤È¤Ï¡¢¹­°èÊÑ¿ô¤Î¥µ¥¤¥º¤òÀë¸À¤¹¤ë¤Î¤Ë»È¤¨¤ë¡£ ¤·¤«¤·°Ü¿¢À­¤Ï¤Ê¤¯¤Ê¤ë¤À¤í¤¦¡£

Îã

¼¡¤Î¥³¡¼¥É¤Ï¡¢¼õ¤±¼è¤Ã¤¿Êä½õ¥Ð¥Ã¥Õ¥¡¤«¤é IP_TTL ¥ª¥×¥·¥ç¥ó¤òõ¤¹¤â¤Î¤Ç¤¢¤ë¡£



struct msghdr msgh;

struct cmsghdr *cmsg;

int *ttlptr;

int received_ttl;



/* Receive auxiliary data in msgh */

for (cmsg = CMSG_FIRSTHDR(&msgh);

    cmsg != NULL;

    cmsg = CMSG_NXTHDR(&msgh,cmsg)) {

        if (cmsg->cmsg_level == IPPROTO_IP

                && cmsg->cmsg_type == IP_TTL) {

            ttlptr = (int *) CMSG_DATA(cmsg);

            received_ttl = *ttlptr;

            break;

        }

}

if (cmsg == NULL) {

    /*

     * Error: IP_TTL not enabled or small buffer

     * or I/O error.

     */

}



°Ê²¼¤Î¥³¡¼¥É¤Ï¡¢ SCM_RIGHTS ¤ò»È¤¤¡¢¥Õ¥¡¥¤¥ë¥Ç¥¹¥¯¥ê¥×¥¿¤ÎÇÛÎó¤ò Unix¥½¥±¥Ã¥È¤òÄ̤·¤ÆÁ÷¤ë¤â¤Î¤Ç¤¢¤ë¡£


struct msghdr msg = {0};

struct cmsghdr *cmsg;

int myfds[NUM_FD]; /* Contains the file descriptors to pass. */

char buf[CMSG_SPACE(sizeof myfds)];  /* ancillary data buffer */

int *fdptr;



msg.msg_control = buf;

msg.msg_controllen = sizeof buf;

cmsg = CMSG_FIRSTHDR(&msg);

cmsg->cmsg_level = SOL_SOCKET;

cmsg->cmsg_type = SCM_RIGHTS;

cmsg->cmsg_len = CMSG_LEN(sizeof(int) * NUM_FD);

/* Initialize the payload: */

fdptr = (int *) CMSG_DATA(cmsg);

memcpy(fdptr, myfds, NUM_FD * sizeof(int));

/* Sum of the length of all control messages in the buffer: */

msg.msg_controllen = cmsg->cmsg_len;

´ØÏ¢¹àÌÜ

recvmsg(2), sendmsg(2)

RFC 2292