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)