Provided by: manpages-es_1.55-10_all bug

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|        │ Ha finalizado un  connect(2) │
       │                  │ POLLOUT        │ 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)