NOMBRE¶
socket - Interfaz de conectores (sockets) de Linux
SINOPSIS¶
#include <sys/socket.h>
mysocket = socket(int socket_family, int
socket_type, int protocol);
DESCRIPCIÓN¶
Esta página de manual describe la interfaz de usuario de la capa de
conectores de red de Linux. Los conectores compatibles con BSD son la interfaz
uniforme entre el proceso de usuario y las pilas de protocolos de red dentro
del núcleo. Los módulos de protocolo se agrupan en
familias
de protocolos como
PF_INET,
PF_IPX y
PF_PACKET, y
tipos de conectores como
SOCK_STREAM o
SOCK_DGRAM. Vea
socket(2) para obtener más información sobre las familias
y los tipos.
FUNCIONES DE LA CAPA DE CONECTORES¶
Estas funciones las usa el proceso de usuario para enviar o recibir paquetes y
para realizar otras operaciones con conectores. Para más
información vea sus páginas de manual respectivas.
socket(2) crea un conector,
connect(2) conecta un conector a una
dirección de conector remota, la función
bind(2) enlaza
un conector a una dirección de conector local,
listen(2) indica
al conector que se aceptarán nuevas conexiones y
accept(2) se
usa para obtener un nuevo conector con una nueva conexión de entrada.
socketpair(2) devuelve dos conectores anónimos conectados
(sólo implementado para unas pocas familias locales como
PF_UNIX)
send(2),
sendto(2) y
sendmsg(2) envían datos a
través de un conector y
recv(2),
recvfrom(2) y
recvmsg(2) reciben datos de un conector.
poll(2) y
select(2) esperan la llegada de datos o la posibilidad de enviar datos.
Además, se pueden usar las operaciones estándares de E/S como
write(2),
writev(2),
sendfile(2),
read(2) y
readv(2) para leer y escribir datos.
getsockname(2) devuelve la dirección de un conector local y
getpeername(2) devuelve la dirección de un conector remoto.
getsockopt(2) y
setsockopt(2) se usan para configurar o
consultar opciones de los protocolos o las capas.
ioctl(2) se puede
usar para configurar o consultar otras opciones determinadas.
close(2) se usa para cerrar un conector.
shutdown(2) cierra partes
de una conexión bidireccional entre conectores.
Las búsquedas o las llamadas a
pread(2) o
pwrite(2) con una
posición distinta de cero, no están soportadas en conectores.
Es posible realizar E/S no bloqueante con conectores activando la opción
O_NONBLOCK sobre el descriptor de fichero de un conector usando
fcntl(2). A continuación, todas las operaciones que normalmente
se bloquearían devolverán (usualmente) el error
EAGAIN .
(la operación deberá ser reintentada más tarde);
connect(2) devolverá un error
EINPROGRESS. Más
tarde, el usuario puede esperar diferentes eventos mediante
poll(2) o
select(2).
Eventos de E/S |
|
|
Evento |
Opción de poll |
Ocurrencia |
Lectura |
POLLIN |
Han llegado nuevos datos. |
Lectura |
POLLIN |
Se ha completado una nueva solicitud de conexión (para conectores
orientados a conexión). |
Lectura |
POLLHUP |
El otro extremo ha iniciado una solicitud de desconexión. |
Lectura |
POLLHUP |
Se ha roto una conexión (sólo para protocolos orientados a
conexión). Cuando se escribe en el conector, también se
envía la señal SIGPIPE . |
Escritura |
POLLOUT |
El conector tiene suficente espacio en el buffer de envío para
escribir nuevos datos. |
Lectura/Escritura |
POLLIN| POLLOUT |
Ha finalizado un connect (2) de salida. |
Lectura/Escritura |
POLLERR |
Se ha producido un error asíncrono. |
Lectura/Escritura |
POLLHUP |
El otro extremo ha cerrado una dirección de la
conexión. |
Excepción |
POLLPRI |
Han llegado datos fuera de orden, lo que hace que se envíe la
señal SIGURG . |
. |
|
|
. |
|
|
. |
|
|
. |
|
|
. |
|
|
. |
|
|
. |
|
|
Una alternativa a poll/select es dejar que el núcleo informe de los
eventos a la aplicación mediante una señal
SIGIO. Para
ello, se debe activar la opción
FASYNC en el descriptor de
fichero de un conector mediante
fcntl(2) y se debe instalar un
manejador de señales válido para
SIGIO mediante
sigaction(2). Vea la discusión sobre
SEÑALES
más abajo.
OPCIONES DE LOS CONECTORES¶
Estas opciones de conector se pueden configurar usando
setsockopt(2) y
consultar con
getsockopt(2) con el nivel de conectores fijado a
SOL_SOCKET para todos los conectores:
- SO_KEEPALIVE
- Habilita el envío de mensajes "sigue vivo" (keep-alive)
en conectores orientados a conexión. Espera una opción
booleana entera.
- SO_OOBINLINE
- Si se habilita esta opción, los datos fuera de orden se colocan
directamente en el flujo de recepción de datos. En otro caso, los
datos fuera de orden sólo se pasan cuando se activa la
opción MSG_OOB durante la recepción.
- SO_RCVLOWAT y SO_SNDLOWAT
- Especifican el número mínimo de bytes en el buffer para que
la capa de conectores pase los datos al protocolo (SO_SNDLOWAT) o
al usuario durante la recepción (SO_RCVLOWAT). Estos dos
valores no se pueden cambiar en Linux y sus argumentos de tamaño
siempre tienen el valor de 1 byte. getsockopt es capaz de leerlos.
setsockopt siempre devolverá ENOPROTOOPT.
- SO_RCVTIMEO y SO_SNDTIMEO
- Especifica los plazos de tiempo (timeouts) para enviar y recibir antes de
informar de un error. En Linux el valor de ambos es fijo y viene dado por
una configuración específica del protocolo y no se pueden ni
leer ni modificar. Su funcionalidad se puede emular usando alarm(2)
o setitimer(2).
- SO_BSDCOMPAT
- Habilita la compatibilidad fallo a fallo con BSD. Esto lo usa sólo
el módulo del protocolo UDP y está previsto que se elimine
en el futuro. Cuando está activa, los errores ICMP recibidos por un
conector UDP no se pasan al programa de usuario. Linux 2.0 también
habilitaba las opciones de compatibilidad fallo a fallo con BSD (cambio
aleatorio de las cabeceras, omisión de la opción de
difusión) para los conectores directos con esta opción, pero
esto se ha eliminado en la versión 2.2 de Linux. Es mejor corregir
los programas de usuario que habilitar esta opción.
- SO_PASSCRED
- Habilita o deshabilita la recepción del mensaje de control
SCM_CREDENTIALS. Para más información, vea
unix(7).
- SO_PEERCRED
- Devuelve las credenciales del proceso externo conectado a este conector.
Sólo útil para conectores PF_UNIX. Vea
unix(7). El argumento es una estructura ucred. Esta
opción sólo es válida para getsockopt.
- SO_BINDTODEVICE
- Enlaza este conector a un dispositivo particular, como
“eth0”, especificado en el nombre de inferfaz pasado. Si el
nombre es una cadena vacía o la longitud de las opciones es cero,
se elimina el enlace entre el dispositivo y el conector. La opción
pasada es una cadena (terminada en \0) de longitud variable con el nombre
de la interfaz, con un tamaño máximo de IFNAMSIZ. Si
el conector está ligado a una interfaz, éste sólo
procesará los paquetes recibidos desde la interfaz particular.
Observe que esto sólo funciona para algunos tipos de conector,
particularmente para conectores de tipo AF_INET bind(8) con
ellos).
- SO_DEBUG
- Activa la depuración de los conectores. Sólo permitida para
los procesos con la capacidad CAP_NET_ADMIN o un identificador de
usuario efectivo 0.
- SO_REUSEADDR
- Indica que las reglas usadas para validar las direcciones proporcionadas
en una llamada bind(2) deben permitir la reutilización de
las direcciones locales. Para los conectores PF_INET esto significa
que un conector se puede enlazar a una dirección, excepto cuando
hay un conector activo escuchando asociado a la dirección. Cuando
el conector que está escuchando está asociado a
INADDR_ANY con un puerto específico, entonces no es posible
realizar enlaces a este puerto para ninguna dirección local.
- SO_TYPE
- Obtiene el tipo de conector como un valor entero (como
SOCK_STREAM). Sólo puede ser leído con
getsockopt.
- SO_ACCEPTCONN
- Devuelve un valor indicando si el conector ha sido marcado o no para
aceptar conexiones con listen(). El valor 0 indica que es un
conector que no escucha peticiones, el valor 1 indica que es un conector
que escucha peticiones. Sólo puede ser leído con
getsockopt.
- SO_DONTROUTE
- No enviar a través de un enrutador, sólo enviar a
ordenadores directamente conectados. Se puede conseguir el mismo efecto
activando la opción MSG_DONTROUTE en una operación
send(2) sobre un conector. Espera una opción booleana
entera.
- SO_BROADCAST
- Establece o consulta la opción de difusión. Cuando
está activa, los conectores de datagramas reciben los paquetes
enviados a una dirección de difusión y se les permite enviar
paquetes a una dirección de difusión. Esta opción no
tiene efecto en conectores orientados a conexión.
- SO_SNDBUF
- Establece u obtiene, en bytes, el máximo buffer de envío de
un conector. El valor por defecto se configura con la sysctl
wmem_default y el máximo valor permitido se establece con la
sysctl wmem_max.
- SO_RCVBUF
- Establece u obtiene, en bytes, el máximo buffer de recepción
de un conector. El valor por defecto se configura con la sysctl
rmem_default y el máximo valor permitido se establece con la
sysctl rmem_max.
- SO_LINGER
- Establece u obtiene la opción SO_LINGER. El argumento es una
estructura linger.
struct linger {
int l_onoff; /* activar/desactivar demora */
int l_linger; /* segundos de demora */
};
- Cuando esta opción está activa, un close(2) o
shutdown(2) no regresarán hasta que todos los mensajes
encolados para el conector hayan sido enviados con éxito o se haya
alcanzado el plazo de tiempo de demora. En otro caso, la llamada regresa
inmediatamente y el cierre se realiza en segundo plano. Cuando el conector
se cierra como parte de una llamada exit(2), siempre se demora en
segundo plano.
- SO_PRIORITY
- Asigna a todos los paquetes a enviar a través de este conector la
prioridad definida por el protocolo. Linux usa este valor para ordenar las
colas de red: los paquetes con una prioridad mayor se pueden procesar
primero dependiendo de la disciplina de encolamiento del dispositivo
seleccionado. Para ip(7), esto también establece el campo
"tipo de servicio IP" (TOS) para los paquetes de salida.
- SO_ERROR
- Obtiene y borra el error de conector pendiente. Sólo válida
para getsockopt. Espera un entero.
SEÑALES¶
Cuando se escribe en un conector orientado a conexión que ha sido cerrado
(por el extremo local o remoto) se envía una señal
SIGPIPE al proceso escritor y se devuelve el valor de error
EPIPE. No se envía la señal cuando la llamada para
escritura especifica la opción
MSG_NOSIGNAL.
Cuando se solicita con la fcntl
FIOSETOWN o la ioctl
SIOCSPGRP, la
señal
SIGIO se envía cuando se produce un evento de E/S.
Es posible usar
poll(2) o
select(2) en el manejador de la
señal para averigurar sobre qué conector se produjo el evento.
Una alternativa (en Linux 2.2) es configurar una señal de tiempo real
usando la fcntl
F_SETSIG. Se llamará al manejador de la
señal de tiempo real con el descriptor de fichero en el campo
si_fd de su estructura
siginfo_t. Vea
fcntl(2) para
más información.
Bajo determinadas circunstancias (por ejemplo, varios procesos accediendo a un
único conector), la condición que ha provocado la señal
SIGIO puede haber desaparecido ya cuando el proceso reaccione a la
señal. Si esto ocurre, el proceso debería esperar de nuevo ya
que Linux reenviará la señal
SIGIO más tarde.
SYSCTLS¶
Se puede acceder a las sysctls fundamentales de red de los conectores usando los
ficheros
/proc/sys/net/core/* o mediante la interfaz
sysctl(2).
- rmem_default
- contiene el valor por defecto, en bytes, del buffer de recepción de
un conector.
- rmem_max
- contiene el tamaño máximo, en bytes, del buffer de
recepción de un conector que el usuario puede establecer usando la
opción de conector SO_RCVBUF.
- wmem_default
- contiene el valor por defecto, en bytes, del buffer de envío de un
conector.
- wmem_max
- contiene el tamaño máximo, en bytes, del buffer de
envío de un conector que un usuario puede configurar usando la
opción de conector SO_SNDBUF.
- message_cost y message_burst
- configuran el filtro de cubetas de fichas usado to load limit warning
messages provocados por eventos de red externos.
- netdev_max_backlog
- Número máximo de paquetes en la cola de entrada global.
- optmem_max
- Longitud máxima de los datos auxiliares y de los datos de control
del usuario, como los iovecs por conector.
IOCTLS¶
Se puede acceder a estas ioctls usando
ioctl(2):
error = ioctl(ip_socket, ioctl_type, &value_result);
- SIOCGSTAMP
- Devuelve una struct timeval con la marca de tiempo recibida del
último paquete pasado al usuario. Esto es útil para realizar
medidas exacta del tiempo de ida y vuelta o tiempo de viaje. Vea
setitimer(2) para una descripción de struct
timeval.
- SIOCSPGRP
- Configura el proceso o grupo de procesos al que enviar la señal
SIGIO o SIGURG cuando termina una operación de E/S
asíncrona o hay disponibles datos urgentes. El argumento es un
puntero a un pid_t. Si el argumento es positivo, las señales
se envian a ese proceso. Si es negativo, las señales se
envían al grupo de procesos cuyo identificador es el valor absoluto
del argumento. El proceso sólo puede seleccionar a él mismo
o a su propio grupo de procesos para que reciban las señales, a
menos que posea la capacidad CAP_KILL o un identificador de usuario
efectivo 0.
- FIOASYNC
- Modifica la opción O_ASYNC para habilitar o deshabilitar el
modo de E/S asíncrona del conector. El modo de E/S asíncrona
significa que se producirá una señal SIGIO, o la
señal establecida mediante F_SETSIG, cuando se produzca un
nuevo evento de E/S.
- El argumento es una opción booleana entera.
- SIOCGPGRP
- Obtiene el proceso o grupo de procesos actual que recibe las señal
SIGIO o SIGURG, o 0 cuando no hay ningúno.
Fcntls válidas:
- FIOGETOWN
- Idéntica a la ioctl SIOCGPGRP.
- FIOSETOWN
- Idéntica a la ioctl SIOCSPGRP.
OBSERVACIONES¶
Linux asume que se usa la mitad del buffer de envío/recepción para
estructuras internas del núcleo. Por tanto, las sysctls son el doble de
lo que se puede observar en última instancia.
FALLOS¶
No se han documentado las opciones de conector
SO_ATTACH_FILTER y
SO_DETACH_FILTER de
CONFIG_FILTER. La interfaz sugerida para
usarlas es la biblioteca libpcap.
VERSIONES¶
SO_BINDTODEVICE se introdujo en la versión 2.0.30 de Linux.
SO_PASSCRED es nueva en la versión 2.2 del núcleo. Las
sysctls son nuevas en Linux 2.2.
AUTORES¶
Esta página de manual fue escrita por Andi Kleen.
VÉASE TAMBIÉN¶
socket(2),
ip(7),
setsockopt(2),
getsockopt(2),
packet(7),
ddp(7)