cmsg(3) - wariua/manpages-ko GitHub Wiki

NAME

CMSG_ALIGN, CMSG_SPACE, CMSG_NXTHDR, CMSG_FIRSTHDR - ๋ณด์กฐ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ

SYNOPSIS

#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);

DESCRIPTION

์ด ๋งคํฌ๋กœ๋“ค์„ ์‚ฌ์šฉํ•ด ์†Œ์ผ“ ํŽ˜์ด๋กœ๋“œ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ์ œ์–ด ๋ฉ”์‹œ์ง€(๋ณด์กฐ ๋ฐ์ดํ„ฐ๋ผ๊ณ ๋„ ํ•จ)๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ ‘๊ทผํ•œ๋‹ค. ๊ทธ๋Ÿฐ ์ œ์–ด ์ •๋ณด์—๋Š” ํŒจํ‚ท์„ ๋ฐ›์€ ์ธํ„ฐํŽ˜์ด์Šค, ๋“œ๋ฌผ๊ฒŒ ์“ฐ์ด๋Š” ์—ฌ๋Ÿฌ ํ—ค๋” ํ•„๋“œ๋“ค, ํ™•์žฅ ์˜ค๋ฅ˜ ์„œ์ˆ , ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ, ์œ ๋‹‰์Šค ํฌ๋ฆฌ๋ด์…œ ์ง‘ํ•ฉ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ œ์–ด ๋ฉ”์‹œ์ง€๋ฅผ ์‚ฌ์šฉํ•ด IP ์˜ต์…˜ ๊ฐ™์€ ์ถ”๊ฐ€์ ์ธ ํ—ค๋” ํ•„๋“œ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. sendmsg(2)๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๋ณด์กฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ณ  recvmsg(2)๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๋ฐ›๋Š”๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ฐ ๋งค๋‰ด์–ผ ํŽ˜์ด์ง€๋“ค์„ ๋ณด๋ผ.

๋ณด์กฐ ๋ฐ์ดํ„ฐ๋Š” cmsghdr ๊ตฌ์กฐ์ฒด์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ง๋ถ™์ธ ๊ฒƒ๋“ค์˜ ๋ฐฐ์—ด์ด๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ œ์–ด ๋ฉ”์‹œ์ง€ ํƒ€์ž…์— ๋Œ€ํ•ด์„  ๊ฐœ๋ณ„ ํ”„๋กœํ† ์ฝœ ๋งจ ํŽ˜์ด์ง€๋ฅผ ๋ณด๋ผ. ์†Œ์ผ“๋ณ„ ๋ณด์กฐ ๋ฒ„ํผ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ /proc/sys/net/core/optmem_max๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. socket(7) ์ฐธ๊ณ .

cmsghdr ๊ตฌ์กฐ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.

struct cmsghdr {
    size_t cmsg_len;    /* ๋ฐ์ดํ„ฐ ๋ฐ”์ดํŠธ ๊ฐœ์ˆ˜. ํ—ค๋” ํฌํ•จ.
                           (POSIX์—์„œ๋Š” ํƒ€์ž…์ด socklen_t) */
    int    cmsg_level;  /* ๊ธฐ์› ํ”„๋กœํ† ์ฝœ */
    int    cmsg_type;   /* ํ”„๋กœํ† ์ฝœ๋ณ„ ํƒ€์ž… */
/* ์ด์–ด์„œ:
    unsigned char cmsg_data[]; */
};

cmsghdr ๊ตฌ์กฐ์ฒด ์—ด์— ์ ˆ๋Œ€๋กœ ์ง์ ‘ ์ ‘๊ทผํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค. ๋Œ€์‹  ๋‹ค์Œ ๋งคํฌ๋กœ๋“ค์„ ์‚ฌ์šฉํ•˜๋ผ.

  • CMSG_FIRSTHDR()๋Š” ์ „๋‹ฌ๋ฐ›์€ msghdr์— ์—ฐ๊ณ„๋œ ๋ณด์กฐ ๋ฐ์ดํ„ฐ ๋ฒ„ํผ์˜ ์ฒซ ๋ฒˆ์งธ cmsghdr์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ฒ„ํผ์— cmsghdr๊ฐ€ ๋“ค์–ด๊ฐˆ ๊ณต๊ฐ„์ด ์—†์œผ๋ฉด NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • CMSG_NXTHDR()๋Š” ์ „๋‹ฌ๋ฐ›์€ cmsghdr ๋‹ค์Œ์˜ ์œ ํšจํ•œ cmsghdr๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ฒ„ํผ์— ์ถฉ๋ถ„ํ•œ ๊ณต๊ฐ„์ด ๋‚จ์•„ ์žˆ์ง€ ์•Š์œผ๋ฉด NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    (๊ฐ€๋ น sendmsg(2)๋กœ ๋ณด๋‚ผ) ์ผ๋ จ์˜ cmsghdr ๊ตฌ์กฐ์ฒด๋ฅผ ๋‹ด์„ ๋ฒ„ํผ๋ฅผ ์ดˆ๊ธฐํ™” ํ•  ๋•Œ๋Š” CMSG_NXTHDR()์˜ ์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘์„ ์œ„ํ•ด ๋จผ์ € ๋ฒ„ํผ๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค.

  • CMSG_ALIGN()์€ ๊ธธ์ด๋ฅผ ๋ฐ›์•„์„œ ํ•„์š” ์ •๋ ฌ์„ ๊ฐ์•ˆํ•œ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ƒ์ˆ˜ ์‹์ด๋‹ค.

  • CMSG_SPACE()๋Š” ์ „๋‹ฌ๋ฐ›์€ ๋ฐ์ดํ„ฐ ๊ธธ์ด์˜ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๊ฐ€์ง„ ๋ณด์กฐ ํ•ญ๋ชฉ์ด ์ฐจ์ง€ํ•˜๋Š” ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ƒ์ˆ˜ ์‹์ด๋‹ค.

  • CMSG_DATA()๋Š” cmsghdr์˜ ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • CMSG_LEN()์€ cmsghdr ๊ตฌ์กฐ์ฒด์˜ cmsg_len ๋ฉค๋ฒ„์— ์ €์žฅํ•  ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, ํ•„์š”ํ•œ ์ •๋ ฌ๊นŒ์ง€ ๊ณ ๋ คํ•œ ๊ฐ’์ด๋‹ค. ๋ฐ์ดํ„ฐ ๊ธธ์ด๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค. ์ƒ์ˆ˜ ์‹์ด๋‹ค.

๋ณด์กฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋จผ์ € msghdr์˜ msg_controllen ๋ฉค๋ฒ„๋ฅผ ์ œ์–ด ๋ฉ”์‹œ์ง€ ๋ฒ„ํผ์˜ ๊ธธ์ด๋กœ ์ดˆ๊ธฐํ™” ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ msghdr์— CMSG_FIRSTHDR()๋ฅผ ์‚ฌ์šฉํ•ด ์ฒซ ๋ฒˆ์งธ ์ œ์–ด ๋ฉ”์‹œ์ง€๋ฅผ ์–ป๊ณ  CMSG_NXTHDR()๋กœ ์ดํ›„ ๋ฉ”์‹œ์ง€๋“ค์„ ์–ป๋Š”๋‹ค. ๊ฐ ์ œ์–ด ๋ฉ”์‹œ์ง€์—์„œ (CMSG_LEN()์œผ๋กœ) cmsg_len์„, ๋‹ค๋ฅธ cmsghdr ํ—ค๋” ํ•„๋“œ๋“ค์„, ๊ทธ๋ฆฌ๊ณ  CMSG_DATA()๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„์„ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ msghdr์˜ msg_controllen ํ•„๋“œ๋ฅผ ๋ฒ„ํผ ๋‚ด ๋ชจ๋“  ์ œ์–ด ๋ฉ”์‹œ์ง€ ๊ธธ์ด์˜ CMSG_SPACE()์˜ ํ•ฉ์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค. msghdr์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋‚ด์šฉ์€ recvmsg(2)๋ฅผ ์ฐธ๊ณ ํ•˜๋ผ.

CONFORMING TO

์ด ๋ณด์กฐ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์€ POSIX.1g ์ดˆ์•ˆ, 4.4BSD-Lite, RFC 2292์—์„œ ๊ธฐ์ˆ ํ•˜๋Š” IPv6 ๊ณ ๊ธ‰ API, SUSv2๋ฅผ ๋”ฐ๋ฅธ๋‹ค. CMSG_ALIGN()์€ ๋ฆฌ๋ˆ…์Šค ํ™•์žฅ์ด๋‹ค.

NOTES

์ด์‹์„ฑ์„ ์œ„ํ•ด์„  ์—ฌ๊ธฐ ๊ธฐ์ˆ ํ•œ ๋งคํฌ๋กœ๋“ค๋งŒ ์‚ฌ์šฉํ•ด ๋ณด์กฐ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค. CMSG_ALIGN()์€ ๋ฆฌ๋ˆ…์Šค ํ™•์žฅ์ด๋ฏ€๋กœ ์ด์‹์„ฑ์ด ์žˆ์–ด์•ผ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.

๋ฆฌ๋ˆ…์Šค์—์„œ CMSG_LEN(), CMSG_DATA(), CMSG_ALIGN()์€ (์ธ์ž๊ฐ€ ์ƒ์ˆ˜๋ผ๊ณ  ๊ฐ€์ • ์‹œ) ์ƒ์ˆ˜ ์‹์ด๊ณ , ๋”ฐ๋ผ์„œ ์ „์—ญ ๋ณ€์ˆ˜ ํฌ๊ธฐ๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐ ๊ทธ ๊ฐ’์„ ์“ธ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด์‹์„ฑ์ด ์—†์„ ์ˆ˜ ์žˆ๋‹ค.

EXAMPLE

๋‹ค์Œ ์ฝ”๋“œ์—์„œ๋Š” ๋ฐ›์€ ๋ณด์กฐ ๋ฒ„ํผ์—์„œ IP_TTL ์˜ต์…˜์„ ์ฐพ๋Š”๋‹ค.

struct msghdr msgh;
struct cmsghdr *cmsg;
int *ttlptr;
int received_ttl;

/* 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) {
    /* ์˜ค๋ฅ˜: IP_TTL์„ ์ผœ์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ๋ฒ„ํผ๊ฐ€ ์ž‘๊ฑฐ๋‚˜ I/O ์˜ค๋ฅ˜ */
}

์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋Š” SCM_RIGHTS๋ฅผ ์ด์šฉํ•ด ์œ ๋‹‰์Šค ๋„๋ฉ”์ธ ์†Œ์ผ“ ์ƒ์œผ๋กœ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•œ๋‹ค.

struct msghdr msg = { 0 };
struct cmsghdr *cmsg;
int myfds[NUM_FD];  /* ์ „๋‹ฌํ•  ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค์„ ๋‹ด์Œ */
char iobuf[1];
struct iovec io = {
    .iov_base = iobuf,
    .iov_len = sizeof(iobuf)
};
union {         /* ๋ณด์กฐ ๋ฐ์ดํ„ฐ ๋ฒ„ํผ. ์ ์ ˆํžˆ ์ •๋ ฌ๋˜๊ฒŒ
                   ํ•˜๊ธฐ ์œ„ํ•ด ๊ณต์šฉ์ฒด๋กœ ๊ฐ์‹ผ๋‹ค */
    char buf[CMSG_SPACE(sizeof(myfds))];
    struct cmsghdr align;
} u;

msg.msg_iov = &io;
msg.msg_iovlen = 1;
msg.msg_control = u.buf;
msg.msg_controllen = sizeof(u.buf);
cmsg = CMSG_FIRSTHDR(&msg);
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SCM_RIGHTS;
cmsg->cmsg_len = CMSG_LEN(sizeof(int) * NUM_FD);
memcpy(CMSG_DATA(cmsg), myfds, NUM_FD * sizeof(int));

SEE ALSO

recvmsg(2), sendmsg(2)

RFC 2292


2019-03-06

โš ๏ธ **GitHub.com Fallback** โš ๏ธ