bionic (2) accept.2.gz

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

NOMBRE

       accept - acepta una conexión sobre un conector (socket).

SINOPSIS

       #include <sys/types.h>
       #include <sys/socket.h>

       int accept(int s, struct sockaddr *addr, socklen_t *addrlen);

DESCRIPCIÓN

       La  función  accept se usa con conectores orientados a conexión (SOCK_STREAM, SOCK_SEQPACKET y SOCK_RDM).
       Extrae la primera petición de conexión de la cola de conexiones pendientes, le asocia un  nuevo  conector
       con,  practicamente,  las  misma  propiedades  que  s  y  reserva  un nuevo descriptor de fichero para el
       conector, el cuál es el valor devuelto por la llamada.  El conector original s no se ve afectado por esta
       llamada.  Dese  cuenta que cualquier opción por descriptor de fichero (cualquiera que se pueda establecer
       con F_SETFL de fcntl, como no bloqueante o estado asíncrono) no se hereda en un accept.

       El argumento s es un conector que ha sido creado con socket(2), ligado a una dirección local con  bind(2)
       y que se encuentra a la escucha tras un listen(2).

       El argumento addr es un puntero a una estructura sockaddr. Esta estructura se rellena con la dirección de
       la entidad con la que se conecta, tal y como la conoce la capa de comunicaciones. El formato exacto de la
       dirección  pasada en el parámetro addr viene determinado por la familia del conector (vea socket(2) y las
       páginas  de  manual  del  protocolo  correspondiente).   El  argumento  addrlen  es   un   parámetro   de
       entrada/salida:  al  efectuar la llamada debe contener el tamaño de la estructura apuntada por addr; a la
       salida, contendrá la longitud real (en bytes) de la dirección devuelta.  Cuando  addr  es  NULL  nada  se
       rellena.

       Si  no  hay  conexiones  pendientes en la cola y el conector no está marcado como "no bloqueante", accept
       bloqueará al invocador hasta que se presente una conexión. Si el conector está marcado como no bloqueante
       y no hay conexiones pendientes en la cola, accept devolverá EAGAIN.

       Para  ser  informado  de  las conexiones entrantes que se produzca en un conector, puede usar select(2) o
       poll(2).  Se producirá un evento de lectura en el intento de una nueva conexión y entonces puede llamar a
       accept  para  obtener  un conector para esa conexión. Alternativamente, puede configurar el conector para
       que provoque una señal SIGIO cuando se  produzca  actividad  en  el  conector;  vea  socket(7)  para  más
       detalles.

       Para determinados protocolos que necesitan una confirmación explícita, tales como DECNet, accept se puede
       interpretar como una función que, simplemente, desencola la siguiente petición de conexión sin  que  ello
       implique  la  confirmación.   Se  sobreentiende la confirmación cuando se produce una lectura o escritura
       normal sobre el nuevo descriptor de fichero, y el rechazo puede ser de igual manera implícito cerrando el
       nuevo conector. Actualmente, sólo DECNet tiene esta semántica en Linux.

OBSERVACIONES

       Puede que no siempre haya una conexión esperando después de que se produzca una señal SIGIO, o después de
       que select(2) o poll(2) devuelvan un evento de lectura, debido  a  que  la  conexión  podría  haber  sido
       eliminada  por  un  error  asíncrono  de  red u otro hilo antes de que se llame a accept.  Si esto ocurre
       entonces la llamada se bloqueará esperando a que llegue la siguiente conexión.  Para  asegurarse  de  que
       accept  nunca  se  bloquea,  es necesario que el conector s pasado tenga la opción O_NONBLOCK activa (vea
       socket(7)).

VALOR DEVUELTO

       La llamada devuelve -1 ante un error. Si tiene éxito, devuelve un entero no negativo que es el descriptor
       del conector aceptado.

MANEJO DE ERRORES

       La  llamada  accept de Linux pasa los errores de red ya pendientes sobre el nuevo conector como un código
       de error de accept.  Este comportamiento difiere de otras  construcciones  de  conectores  BSD.  Para  un
       funcionamiento fiable, la aplicación debe detectar los errores de red definidos por el protocolo tras una
       llamada a accept y tratarlos como EAGAIN reintentado la  operación.  En  el  caso  de  TCP/IP  estos  son
       ENETDOWN, EPROTO, ENOPROTOOPT, EHOSTDOWN, ENONET, EHOSTUNREACH, EOPNOTSUPP y ENETUNREACH.

ERRORES

       accept fallará si:

       EAGAIN o EWOULDBLOCK
              El conector está marcado como no-bloqueante y no hay conexiones que aceptar.

       EBADF  El descriptor es inválido.

       ENOTSOCK
              El descriptor referencia a un fichero, no a un conector.

       EOPNOTSUPP
              El conector referenciado no es del tipo SOCK_STREAM.

       EINTR  La  llamada  al  sistema fue interrumpida por una señal que fue capturada antes de que llegara una
              conexión válida.

       ECONNABORTED
              Una conexión fue abortada.

       EINVAL El conector no está escuchando conexiones.

       EMFILE El límite de descriptores de fichero abiertos por proceso ha sido alcanzado.

       ENFILE El límite máximo del sistema para descriptores de fichero ha sido alcanzado.

       accept puede fallar si:

       EFAULT El parámetro addr no se encuentra en una zona accesible para escritura por el usuario.

       ENOBUFS, ENOMEM
              No hay suficiente memoria disponible.  Esto normalmente significa que  la  asignación  de  memoria
              está limitada por los límites del buffer de conectores, no por la memoria del sistema.

       EPROTO Error de protocolo.

       La llamada accept de Linux puede fallar si:

       EPERM  Las reglas del cortafuegos prohíben la conexión.

       Además,  se  pueden devolver otros errores de red para el nuevo conector y que se encuentren definidos en
       el protocolo.  Diferentes  núcleos  de  Linux  pueden  devolver  otros  errores  diferentes  como  ENOSR,
       ESOCKTNOSUPPORT, EPROTONOSUPPORT, ETIMEDOUT.  El valor ERESTARTSYS puede darse durante una ejecución paso
       a paso.

CONFORME A

       SVr4, 4.4BSD (la función accept apareció por primera vez en  BSD  4.2).   La  página  de  manual  de  BSD
       documenta  cinco  posibles respuestas de error (EBADF, ENOTSOCK, EOPNOTSUPP, EWOULDBLOCK, EFAULT).  SUSv3
       documenta los errores EAGAIN, EBADF,  ECONNABORTED,  EINTR,  EINVAL,  EMFILE,  ENFILE,  ENOBUFS,  ENOMEM,
       ENOTSOCK, EOPNOTSUPP, EPROTO, EWOULDBLOCK. Además, SUSv2 documenta EFAULT y ENOSR.

       La  llamada  accept de Linux no hereda opciones de conector como O_NONBLOCK.  Este comportamiento difiere
       de  otras  construcciones  de  conectores  BSD.   Los  programas  portables  no  deben  confiar  en  este
       comportamiento y establecer siempre todas las opciones requeridas en el conector devuelto por accept.

NOTA

       El  tercer argumento de accept se declaró originalmente como un `int *' (y así está en libc4 y libc5 y en
       otros muchos sistemas como BSD 4.*, SunOS 4, SGI); el estándar propuesto POSIX 1003.1g quiso cambiarlo  a
       `size_t  *' y así está en SunOS 5.  Más tarde, los borradores POSIX tenían `socklen_t *' y así lo tomaron
       the Single Unix Specification y glibc2.  Citando  a  Linus  Torvalds:  _Cualquier_  biblioteca  razonable
       _debe_  hacer  que  "socklen_t"  sea del mismo tamaño que int. Cualquier otra cosa destroza todo lo de la
       capa de conectores BSD. POSIX inicialmente estableció el tipo a size_t y, de hecho, yo (y es  de  suponer
       que  otros  aunque,  obviamente,  no  demasiados)  nos  quejamos  a  gritos.  El  ser  de  tipo size_t es
       completamente desastroso, precisamente porque, por ejemplo, size_t muy rara vez es del mismo  tamaño  que
       "int"  en  arquitecturas  de  64  bit. Y _tiene_ que ser del mismo tamaño que "int" porque así está en la
       interfaz de conectores BSD.  De cualquier modo, los de POSIX  finalmente  tuvieron  una  idea  y  crearon
       "socklen_t".  Para empezar, no deberían haberlo tocado pero, una vez que lo hicieron, pensaron que debían
       tener  un  tipo  con  nombre  propio  por  alguna  insondable  razón  (probablemente  alguien  no  quería
       desprestigiarse por haber cometido la estupidez original por lo que, simplemente, renombraron su metedura
       de pata de forma silenciosa).

VÉASE TAMBIÉN

       bind(2), connect(2), listen(2), select(2), socket(2)