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.5 1999/05/18 10:35:02 freitag Exp $
.\"
.\" Translated on Mon Jun 28 1999 by Juan Piernas <piernas@ditec.um.es>
.\"
.TH CMSG 3 "2 octubre 1998" "Pgina man de Linux" "Manual del Programador de Linux"
.SH NONMBRE
CMSG_ALIGN, CMSG_SPACE, CMSG_NXTHDR, CMSG_FIRSTHDR \- Acceso a datos auxiliares.
.SH SINOPSIS
.B #include <sys/socket.h>
.br
.sp 2
.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 "void *CMSG_DATA(struct cmsghdr *" cmsg ");"
.sp
.nf
.ta 8n 20n 32n
struct cmsghdr {
socklen_t cmsg_len; /* cantidad de bytes de datos,
incluyendo la cabecera */
int cmsg_level; /* protocolo originario */
int cmsg_type; /* tipo especfico del protocolo */
/* seguido de
unsigned char cmsg_data[]; */
};
.ta
.fi
.SH DESCRIPCIN
Estas macros se usan para crear y acceder a mensajes de control (tambin
llamados datos auxiliares) que no son parte del contenido til de un
conector.
Esta informacin de control puede incluir la interfaz en la que se ha
recibido el paquete, diferentes campos de cabecera usados raramente, una
descripcin de error ampliada, un conjunto de descriptores de fichero o
credenciales de Unix. Por ejemplo, los mensajes de control se pueden usar
para enviar campos de cabecera adicionales tales como opciones IP.
Los datos auxiliares se envan llamando a
.BR sendmsg (2)
y se reciben llamando a
.BR recvmsg (2).
Vea sus pginas de manual para ms informacin.
.PP
Los datos auxiliares son una secuencia de estructuras
.B struct cmsghdr
con datos aadidos. Slo se debera acceder a esta secuencia usando las
macros descritas en esta pgina de manual y nunca directamente.
Vea las pginas de manual especficas del protocolo para conocer los tipos
de mensajes de control disponibles.
El tamao mximo permitido del buffer auxiliar por conector se puede
configura con la sysctl
.BR net.core.optmem_max .
Vea
.BR socket (7).
.PP
.B CMSG_FIRSTHDR
devuelve un puntero a la primera
.B cmsghdr
en el buffer de datos auxiliares asociado con la
.B msghdr
pasada.
.PP
.B CMSG_NXTHDR
devuelve la siguiente
.B cmsghdr
vlida despus de la
.B cmsghdr
pasada. Devuelve
.B NULL
cuando no queda suficiente espacio en el buffer.
when there isn't enough space left in the buffer.
.PP
.BR CMSG_ALIGN ,
dada una longitud, la devuelve incluyendo la alineacin necesaria. sta es
una expresin constante.
.PP
.B CMSG_SPACE
devuelve la cantidad de bytes que ocupa un elemento auxiliar cuyo
contenido til es de la longitud de datos pasada. sta es una expresin
constante.
.PP
.B CMSG_DATA
devuelve un puntero a la porcin de datos de una
.BR cmsghdr .
.PP
.B CMSG_LEN
devuelve el valor a almacenar en el miembro
.I cmsg_len
de la estructura
.B cmsghdr
teniendo en cuenta cualquier alineacin necesaria. Toma como argumento la
longitud de los datos. sta es una expresin constante.
.PP
Para crear datos auxiliares, inicialice primero el miembro
.I msg_controllen
de la estructura
.B msghdr
con el tamao del buffer de mensajes de control. Use
.B CMSG_FIRSTHDR
sobre
.B msghdr
para obtener el primer mensaje de control y
.B CMSG_NEXTHDR
para obtener los siguientes.
En cada mensaje de control, inicialice
.I cmsg_len
(con
.BR CMSG_LEN ),
los otros campos cabecera de
.B cmsghdr
y la parte de datos usando
.BR CMSG_DATA .
Finalmente, debera asignar al campo
.I msg_controllen
de
.B msghdr
la suma de los
.B CMSG_SPACE
de las longitudes de todos los mensajes de control del buffer.
Para ms informacin sobre
.BR msghdr ,
vea
.BR recvmsg (2).
.PP
Cuando el buffer de mensajes de control es demasiado pequeo para almacenar
todos los mensajes, se activa la bandera
.B MSG_CTRUNC
en el miembro
.I msg_flags
de
.BR msghdr .
.SH EJEMPLO
Este cdigo busca la opcin
.B IP_TTL
en un buffer auxiliar recibido:
.PP
.RS
.nf
.ta 8n 16n 32n
struct msghdr msgh;
struct cmsghdr *cmsg;
int *ttlptr;
int received_ttl;
/* Recibir los datos auxiliares en 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 no habilitada o buffer demasiado corto o
error de E/S. */
}
.ta
.fi
.RE
.PP
El siguiente cdigo pasa un vector de descriptores de ficheros mediante un
conector Unix usando
.BR SCM_RIGHTS :
.PP
.RS
.nf
.ta 8n 16n 32n
struct msghdr msg = {0};
struct cmsghdr *cmsg;
int myfds[NUM_FD]; /* Los descriptores de fichero a pasar. */
char buf[CMSG_SPACE(sizeof myfds)]; /* buffer de datos auxiliares */
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);
/* Inicializar el contenido til: */
fdptr = (int *)CMSG_DATA(cmsg);
memcpy(fdptr, myfds, NUM_FD * sizeof(int));
/* Sumar la longitud de todos los mensajes de control en el buffer: */
msg.msg_controllen = cmsg->cmsg_len;
.ta
.fi
.RE
.SH NOTAS
Para transportabilidad, slo se debera acceder a los datos auxiliares
usando las macros descritas aqu.
.B CMSG_ALIGN
es una extensin de Linux y no debera usarse en programas transportables.
.PP
En Linux,
.BR CMSG_LEN ,
.BR CMSG_DATA
y
.B CMSG_ALIGN
son expresiones constantes (suponiendo que su argumento sea contante). Esto
se podra usar para declarar el tamao de variables globales pero, sin embargo,
podra no ser transportable.
.SH CONFORME A
El modelo de datos auxiliares sigue el borrador POSIX.1003.1g, 4.4BSD-Lite,
la API avanzada de IPv6 descrita en RFC2292 y the Single Unix specification v2.
.B
CMSG_ALIGN
es una extensin de Linux.
.SH VASE TAMBIN
.BR sendmsg "(2), " recvmsg (2)
.PP
RFC 2292
|