socket - Interfaz de conectores (sockets) de Linux
#include <sys/socket.h>
mysocket = socket(int socket_family, int
socket_type, int protocol);
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.
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.
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.
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.
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.
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.
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.
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.
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.
Esta página de manual fue escrita por Andi Kleen.