Home :: International :: Manuals :: Howto :: FAQ :: Man Pages :: Email Login

 
 

 

CMSG

Section: Linux Programmer's Manual (3)
Updated: 2 Oct 1998
Index Return to Main Contents
 

̾Á°

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 charcmsg_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_LEN ¤ò»È¤Ã¤Æ½é´ü²½¤ò¤¹¤ë¡£ ºÇ¸å¤Ë msghdr ¤Î msg_controllen ¥Õ¥£¡¼¥ë¥É¤Ë¡¢¥Ð¥Ã¥Õ¥¡Ãæ¤ÎÀ©¸æ¥á¥Ã¥»¡¼¥¸¤ÎŤµ¤Î CMSG_SPACE ¤Î¹ç·×¤¬¥»¥Ã¥È¤µ¤ì¤ë¡£ msghdr ¤Ë¤Ä¤¤¤Æ¤Î¾ÜºÙ¤Ï recvmsg(2) ¤ò»²¾È¡£

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

Îã

¼¡¤Î¥³¡¼¥É¤Ï¡¢¼õ¤±¼è¤Ã¤¿Êä½õ¥Ð¥Ã¥Õ¥¡¤«¤é 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 == SOL_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;

 

Ãí°Õ

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

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

½àµò

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

´ØÏ¢¹àÌÜ

sendmsg(2), recvmsg(2)

RFC 2292


 

Index

̾Á°
½ñ¼°
ÀâÌÀ
Îã
Ãí°Õ
½àµò
´ØÏ¢¹àÌÜ

 
 
 
 
Google
  Web Linuxinfor   
 

Home :: Copyright :: Privacy :: Credits :: Get a free Linuxinfor Email Account

Document on this page is part of "Linuxinfor Man Pages in HTML Format: man3". See Index Page for more info about Authorship and Copyright.

1999-2008 Linuxinfor.com. No rights reserved.