accept - accept a connection on a socket


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

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


       The  argument  s  is  a  socket that has been created with
       socket(2), bound to an address with bind(2), and  is  lis­
       tening  for  connections  after  a  listen(2).  The accept
       function extracts the  first  connection  request  on  the
       queue  of  pending  connections, creates a new socket with
       the same  properties  of  s,  and  allocates  a  new  file
       descriptor  for the socket.  If no pending connections are
       present on the queue, and the socket is not marked as non-
       blocking,  accept  blocks the caller until a connection is
       present.  If the socket  is  marked  non-blocking  and  no
       pending  connections  are  present  on  the  queue, accept
       returns an error as described below.  The socket  returned
       by accept may not be used to accept more connections.  The
       original socket s remains open.

       The argument addr is a result parameter that is filled  in
       with the address of the connecting entity, as known to the
       communications layer.  The exact format of the addr param­
       eter  is  determined by the domain in which the communica­
       tion is occurring.  addrlen is a  value-result  parameter:
       it should initially contain the amount of space pointed to
       by addr; on return it will contain the actual  length  (in
       bytes)  of  the  address returned.  This call is used with
       connection-based socket types, currently with SOCK_STREAM.

       It  is  possible to select(2) a socket for the purposes of
       doing an accept by selecting it for read.

       For certain protocols which require an explicit  confirma­
       tion,  such  as DECNet, accept can be thought of as merely
       dequeuing the next connection  request  and  not  implying
       confirmation.   Confirmation  can  be  implied by a normal
       read or write on the new file  descriptor,  and  rejection
       can  be  implied by closing the new socket. Currently only
       DECNet has these semantics on Linux.


       If you want accept to never  block  the  listening  socket
       needs  to  have  the  non blocking flag set. Assuming that
       there is always a connection waiting after select returned
       true  is  not  reliable,  because  the connection might be
       removed by  an  asynchronous  network  error  between  the
       select/poll returning and the accept call. The application
       The  call returns -1 on error.  If it succeeds, it returns
       a non-negative  integer  that  is  a  descriptor  for  the
       accepted socket.


       Linux  accept passes already-pending network errors on the
       new socket as an error code from accept.   This  behaviour
       differs  from  other BSD socket implementations. For reli­
       able operation the application should detect  the  network
       errors  defined  for  the  protocol after accept and treat
       them like EAGAIN by retrying. In case of TCP/IP these  are


       EBADF   The descriptor is invalid.

               The descriptor references a file, not a socket.

               The referenced socket is not of type  SOCK_STREAM.

       EFAULT  The  addr  parameter  is not in a writable part of
               the user address space.

       EAGAIN  The socket is marked non-blocking and  no  connec­
               tions are present to be accepted.

       EPERM   Firewall rules forbid connection.

               Not enough free memory.

       In  addition,  network  errors  for  the new socket and as
       defined for the protocol may be returned.


       SVr4, 4.4BSD (the accept function first  appeared  in  BSD


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