Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages


home | help
ACCEPT(2)		  FreeBSD System Calls Manual		     ACCEPT(2)

     accept, accept4 --	accept a connection on a socket

     #include <sys/socket.h>

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

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

     The argument s is a socket	that has been created with socket(2), bound to
     an	address	with bind(2), and is listening for connections after a
     listen(2).	 The accept() call extracts the	first connection request on
     the queue of pending connections, creates a new socket with the same non-
     blocking I/O mode as s, and allocates a new file descriptor for the
     socket with the close-on-exec flag	clear.

     The accept4() system call is similar, however the non-blocking I/O	mode
     of	the new	socket is determined by	the SOCK_NONBLOCK flag in the flags
     argument and the close-on-exec flag on the	new file descriptor is deter-
     mined by the SOCK_CLOEXEC flag in the flags argument.

     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 accepted socket 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	ad-
     dress of the connecting entity as known to	the communications layer.  The
     exact format of the addr parameter	is determined by the domain in which
     the communication is occurring.  The structure sockaddr_storage exists
     for greater portability.  It is large enough to hold any of the types
     that may be returned in the addr parameter.

     The 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.	 If addrlen does not point to
     enough space to hold the entire socket address, the result	will be	trun-
     cated to the initial value	of addrlen (in bytes).	This call is used with
     connection-based socket types, currently with SOCK_STREAM.

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

     If	successful, accept() and accept4() return a non-negative integer, the
     accepted socket file descriptor.  Otherwise, a value of -1	is returned
     and errno is set to indicate the error.

     The following code	uses struct sockaddr_storage to	allocate enough	space
     for the returned address:

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

	   struct sockaddr_storage addr;
	   socklen_t len = sizeof(addr);
	   int retcode;

	   retcode = accept(s, (struct sockaddr	*)&addr, &len);
	   if (retcode == -1)
		   err(1, "accept");

     accept() and accept4() will fail if:

     [EBADF]		The descriptor is invalid.

     [ENOTSOCK]		The descriptor doesn't reference a socket.

     [EOPNOTSUPP]	The referenced socket is not of	type SOCK_STREAM.

     [EINTR]		A signal was caught before a connection	arrived.

     [EINVAL]		The referenced socket is not listening for connections
			(that is, listen(2) has	not yet	been called).

     [EFAULT]		The addr or addrlen parameter is not in	a valid	part
			of the process address space.

     [EWOULDBLOCK]	The socket is marked non-blocking and no connections
			are present to be accepted.

     [EMFILE]		The per-process	descriptor table is full.

     [ENFILE]		The system file	table is full.

     [ECONNABORTED]	A connection has been aborted.

     In	addition, accept4() will fail if

     [EINVAL]		flags is invalid.

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

     The accept() function conforms to IEEE Std	1003.1-2008 ("POSIX.1").  The
     accept4() function	is expected to conform to a future revision of that

     The accept() system call first appeared in	4.1cBSD	and accept4() in
     OpenBSD 5.7.

     When EMFILE or ENFILE is returned,	new connections	are neither dequeued
     nor discarded.  Thus considerable care is required	in select(2) and
     poll(2) loops.

FreeBSD	13.0			 May 26, 2019			  FreeBSD 13.0


Want to link to this manual page? Use this URL:

home | help