1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
|
.\" This man page is Copyright (C) 1999 Andi Kleen <ak@muc.de>.
.\" Permission is granted to distribute possibly modified copies
.\" of this page provided the header is included verbatim,
.\" and in case of nontrivial modification author and date
.\" of the modification is added to the header.
.\" $Id: cmsg.3,v 1.3 2001/01/14 05:30:39 hanataka Exp $
.\"
.\" Japanese Version Copyright (c) 1999 Shouichi Saito
.\" all rights reserved.
.\" Translated Mon Jul 26 21:58:26 JST 1999
.\" by Shouichi Saito <ss236rx@ymg.urban.ne.jp>
.\" Proofed Tue Aug 17 1999 by NAKANO Takeo <nakano@apm.seikei.ac.jp>
.\"
.TH CMSG 3 1998-10-02 "Linux" "Linux Programmer's Manual"
.SH ̾
CMSG_ALIGN, CMSG_SPACE, CMSG_NXTHDR, CMSG_FIRSTHDR \- ǡ˥롣
.SH
.B #include <sys/socket.h>
.sp
.BI "struct cmsghdr *CMSG_FIRSTHDR(struct msghdr *" msgh );
.br
.BI "struct cmsghdr *CMSG_NXTHDR(struct msghdr *" msgh ", struct cmsghdr *" cmsg );
.br
.BI "size_t CMSG_ALIGN(size_t " length );
.br
.BI "size_t CMSG_SPACE(size_t " length );
.br
.BI "size_t CMSG_LEN(size_t " length );
.br
.BI "unsigned char *CMSG_DATA(struct cmsghdr *" cmsg );
.sp
.nf
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[]; */
};
.fi
.SH
Υޥå
(ǡ (ancillary data) ȤƤФ) ꡢ
˥뤿˻Ȥ롣
åϥåȤˤΤǡǤϤʤ
ϡ夷ѥåȤؤΥե͡ʤޤ
Ȥʤإåեɡ顼Ҥγĥեǥ
ץν䡢Unixˤ뿮 (credential) ޤǤ롣
åϡ㤨 IP ץΤ褦ɲåإåեɤ
Τ˻ȤǤ롣
ǡϡ
.BR sendmsg (2)
ƤӽФꡢ
.BR recvmsg (2)
ƤӽФƼ롣
ܺ٤ϤΥޥ˥奢ڡȡ
.PP
ǡ
.I struct cmsghdr
¤ΤΥɲåǡղä줿ΤǤ롣
ΥˤϤΥޥ˥奢ڡ˽Ƥ
ޥȤäƥ٤ǡľܥ٤ǤϤʤ
ѲǽåΥפˤĤƤϡ
줾ΥץȥΥޥ˥奢ڡȤΤȡ
³κѥХåե
.I net.core.optmem_max
sysctl ȤäǤ롣
.BR socket (7)
ȡ
.PP
.BR CMSG_FIRSTHDR ()
ϡϤ
.I msghdr
˴ϢǡХåեΡǽ
.I cmsghdr
ؤΥݥ֤
.PP
.BR CMSG_NXTHDR ()
ϡϤ
.I cmsghdr
μˤ (ͭ)
.I cmsghdr
֤
Хåե˽ʬʶ̵硢NULL ֤
.PP
.BR CMSG_ALIGN ()
ĹͿȡɬפʥ饤Ȥ̣Ĺ֤Ƥ롣
Ǥ롣
.PP
.BR CMSG_SPACE ()
ϡͿǡĹΤɬפ (ancillary element)
Хȿ֤Ǥ롣
.PP
.BR CMSG_DATA ()
ϡ
.I cmsghdr
ΥǡʬؤΥݥ֤
.PP
.BR CMSG_LEN ()
ϡ
.I cmsghdr
¤Τ
.I cmsg_len
Ф˥ǡǼݤɬפ֤ͤ饤Ȥθ
롣
ȤƥǡĹȤ롣Ǥ롣
.PP
ǡ뤿ˤϺǽ
.I msghdr
ΥС
.I msg_controllen
åХåեĹǽ롣
.BR CMSG_FIRSTHDR ()
.I msghdr
ѤȺǽå졢
.B CMSG_NEXTHDR
Ȥȼå롣
줾åǤϡ
.I cmsg_len
.RB ( CMSG_LEN ()
Ȥ)
¾
.I cmsghdr
إåեɡƥǡʬФƤ
.BR CMSG_DATA ()
Ȥäƽ롣
Ǹ
.I msghdr
.I msg_controllen
եɤˡХåեåĹ
.BR CMSG_SPACE ()
ιפåȤ롣
.I msghdr
ˤĤƤξܺ٤
.BR recvmsg (2)
ȡ
.PP
åХåեƤΥåǼΤˤû硢
.I msghdr
.I msg_flags
С
.B MSG_CTRUNC
ե饰åȤ롣
.SH
ǡǥϡPOSIX.1g draft, 4.4BSD-Lite, RFC\ 2292
ҤƤ IPv6 advanced API, SUSv2
˽Ƥ롣
.B CMSG_ALIGN
Linux γĥǤ롣
.SH
ܿΤˡǡؤΥˤϡ
ǽҤ٤ƤޥȤˤ٤Ǥ롣
.BR CMSG_ALIGN ()
Linux ǤγĥǤꡢܿͤץǤϻȤ٤ǤϤʤ
.PP
Linux Ǥ
.BR CMSG_LEN (),
.BR CMSG_DATA (),
.BR CMSG_ALIGN ()
Ǥ (ΰȤߤʤ)
ΤȤϡѿΥΤ˻Ȥ롣
ܿϤʤʤ
.SH
ΥɤϡäХåե
.B IP_TTL
ץõΤǤ롣
.PP
.in +4n
.nf
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.
*/
}
.fi
.in
.PP
ʲΥɤϡ
.B SCM_RIGHTS
Ȥեǥץ Unix åȤ̤ΤǤ롣
.PP
.in +4n
.nf
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;
.fi
.in
.SH Ϣ
.BR recvmsg (2),
.BR sendmsg (2)
.PP
RFC\ 2292
|