|
|
|
SOCKET
Section: Manual del Programador de Linux (7) Updated: 7 mayo 1999 Index
Return to Main Contents
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).
O_NONBLOCK
se hereda durante una llamada a accept.
A continuación, todas las operaciones que normalmente se bloquearían
devolverán (usualmente) el error
EAGAIN.
connect(2)
devuelve un error
EINPROGRESS
en este caso.
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 lqeth0rq,
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.
- 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_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
FIOCSETOWN
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:
- FIOCGETOWN
-
Idéntica a la ioctl SIOCGPGRP.
- FIOCSETOWN
-
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)
Index
- NOMBRE
-
- SINOPSIS
-
- DESCRIPCIÓN
-
- FUNCIONES DE LA CAPA DE CONECTORES
-
- OPCIONES DE LOS CONECTORES
-
- SEÑALES
-
- SYSCTLS
-
- IOCTLS
-
- OBSERVACIONES
-
- FALLOS
-
- VERSIONES
-
- AUTORES
-
- VÉASE TAMBIÉN
-
|