NOMBRE¶
send, sendto, sendmsg - envía un mensaje de un conector (socket)
SINOPSIS¶
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int s, const void *msg, size_t
len, int flags);
ssize_t sendto(int s, const void *msg, size_t
len, int flags, const struct sockaddr
*to, socklen_t tolen);
ssize_t sendmsg(int s, const struct msghdr
*msg, int flags);
DESCRIPCIÓN¶
Send,
sendto y
sendmsg son utilizados para transmitir un
mensaje a otro conector.
Send solo puede ser usado cuando un conector
está en un estado
connected mientras
sendto y
sendmsg pueden ser utilizados en cualquier momento.
La dirección de destino viene dada por
to con
tolen
especificando su tamaño. La longitud del mensaje viene dada por
len. Si el mensaje es demasiado largo para pasar automáticamente a
través del protocolo inferior, se devuelve el error
EMSGSIZE y el
mensaje no es transmitido.
La llamada
send lleva implícita el que no se indiquen los posibles
errores en la entrega. Los errores detectados localmente se indican
devolviendo un valor -1.
Cuando el mensaje no cabe en el buffer de envío del conector,
send
se bloquea, a no ser que el conector se haya colocado en el modo de E/S no
bloqueante. En el modo no bloqueante devolvería
EAGAIN en este
caso. Se puede utilizar la llamada
select(2) para determinar cuando es
posible enviar más información.
El parámetro
flags es una palabra de opciones y puede contener las
siguientes opciones:
- MSG_OOB
- Enviar datos fuera de orden(out-of-band) en
conectores que soportan esta noción (p.ej. SOCK_STREAM); el
protocolo subyacente también debe soportar datos fuera de
orden.
- MSG_DONTROUTE
- No usar un ``gateway'' para enviar el paquete, enviar
sólo a los ordenadores que se encuentren en redes conectadas
directamente. Normalmente, esto sólo lo utilizan los programas de
diagnóstico y enrutamiento. Esta opción sólo está
definida para familias de protocolos que enrutan. Los conectores de
paquetes no enrutan.
- MSG_DONTWAIT
- Habilitar el funcionamiento no bloqueante. Si la
operación se bloqueara, se devolvería EAGAIN (esto
también se puede habilitar usando la bandera O_NONBLOCK con la
operación F_SETFL de fcntl(2)).
- MSG_NOSIGNAL
- Solicitar el no enviar SIGPIPE en caso de error en
conectores orientados a conexión cuando el otro extremo rompa la
conexión. Todavía se devuelve el error EPIPE.
- MSG_CONFIRM (Linux 2.3+ solamente)
- Le dice a la capa de enlace que se produjo el proceso de
redirección: tienes una confirmación positiva del otro lado. Si
la capa de enlace no recibe esta respuesta interrogará regularmente
al vecino (p.e. a través de un mensaje ARP unicast). Sólo
válida para conectores SOCK_DGRAM y SOCK_RAW y
actualmente sólo está implementada en IPv4 e IPv6. Vea
arp(7) para más detalles.
La definición de la estructura
msghdr se muestra a
continuación. Vea
recv(2) y más abajo para una
descripción exacta de sus campos.
struct msghdr {
void * msg_name; /* dirección opcional */
socklen_t msg_namelen; /* tamaño de la dirección */
struct iovec * msg_iov; /* vector dispersión/reunión */
size_t msg_iovlen; /* # elementos en msg_iov */
void * msg_control; /* datos auxiliares, vea más abajo */
socklen_t msg_controllen; /* longitud del buffer de datos auxiliares */
int msg_flags; /* banderas en el mensaje recibido */
};
Puede enviar información de control usando los miembros
msg_control
y
msg_controllen. La longitud máxima del buffer de control que el
núcleo puede procesar está limitada por conector por la sysctl
net.core.optmem_max. Vea
socket(7).
VALOR DEVUELTO¶
Las llamadas devuelven el numero de caracteres enviados, o -1 si ha ocurrido un
error.
ERRORES¶
Estos son algunos errores estándares generados por la capa de conectores.
Los módulos de los protocolos subyacentes pueden generar y devolver
errores adicionales. Vea sus páginas de manual respectivas.
- EBADF
- Se ha especificado un descriptor no válido.
- ENOTSOCK
- El argumento s no es un conector.
- EFAULT
- Se ha especificado como parámetro una dirección
incorrecta del espacio de usuario. tro.
- EMSGSIZE
- El conector requiere que este mensaje sea enviado
automáticamente, y el tamaño del mensaje a ser enviado lo hace
imposible.
- EAGAIN o EWOULDBLOCK
- El conector está marcado como no bloqueante y la
operación solicitada lo bloquearía.
- ENOBUFS
- La cola de salida del interfaz de red está llena. Esto
generalmente indica que el interfaz ha parado de enviar, pero puede ser
causado por una congestión temporal. (Esto no puede ocurrir en Linux,
los paquetes simplemente se suprimen silenciosamente cuando la cola de un
dispositivo se desborda.)
- EINTR
- Se ha producido una señal.
- ENOMEM
- No hay memoria disponible.
- EINVAL
- Se ha pasado un argumento inválido.
- EPIPE
- Se ha desconectado el extremo local en un conector
orientado a conexión. En este caso el proceso tambíen
recibirá una señal SIGPIPE a menos que se active la
opción MSG_NOSIGNAL.
4.4BSD, SVr4, borrador POSIX 1003.1g (estas llamadas a función aparecieron
en 4.2BSD).
MSG_CONFIRM es una extensión de Linux.
NOTA¶
Los prototipos indicados más arriba siguen `the Single Unix Specification',
ya que glibc2 también lo hace; el argumento
flags era `int' en BSD
4.* pero `unsigned int' en libc4 y libc5; el argumento
len era `int' en
BSD 4.* y libc4 pero `size_t' en libc5; el argumento
tolen era `int' en
BSD 4.*, libc4 y libc5. Vea también
accept(2).
VÉASE TAMBIÉN¶
fcntl(2),
recv(2),
select(2),
getsockopt(2),
sendfile(2),
socket(2),
write(2),
socket(7),
ip(7),
tcp(7),
udp(7)