socket

SOCKET(7)                Manual del Programador de Linux               SOCKET(7)



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)



Página man de Linux                7 mayo 1999                         SOCKET(7)