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 │
       │                  │ POLLOUT        │ 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)