| SOCKET(2) | System Calls Manual | SOCKET(2) |
socket — create an
endpoint for communication
Standard C Library (libc, -lc)
#include
<sys/socket.h>
int
socket(int
domain, int type,
int protocol);
socket()
creates an endpoint for communication and returns a descriptor.
The domain parameter specifies a communications domain within which communication will take place; this selects the protocol family which should be used. These families are defined in the include file ⟨sys/socket.h⟩. The currently understood formats are:
PF_LOCAL |
local domain (previously UNIX domain) protocols |
PF_INET |
ARPA Internet protocols |
PF_INET6 |
IPv6 (Internet Protocol version 6) protocols |
PF_NS |
Xerox Network Systems protocols |
PF_APPLETALK |
AppleTalk protocols |
PF_BLUETOOTH |
Bluetooth protocols |
PF_CAN |
CAN bus protocols |
The socket has the indicated type, which specifies the semantics of communication. Currently defined types are:
SOCK_STREAMSOCK_DGRAMSOCK_RAWSOCK_SEQPACKETSOCK_RDMThe following flags can be or'ed to the socket type to add conditions to the returned file descriptor:
SOCK_CLOEXECSOCK_CLOFORKSOCK_NONBLOCKSOCK_NOSIGPIPEEPIPE instead of raising
SIGPIPE.The protocol specifies a particular protocol to be used with the socket. Normally only a single protocol exists to support a particular socket type within a given protocol family. However, it is possible that many protocols may exist, in which case a particular protocol must be specified in this manner. The protocol number to use is particular to the “communication domain” in which communication is to take place; see protocols(5).
Sockets of type SOCK_STREAM
are full-duplex byte streams. A stream socket must be in a
connected state
before any data may be sent or received on it. A connection to another
socket is created with a
connect(2) call. Once
connected, data may be transferred using
read(2) and
write(2) calls or some variant
of the send(2) and
recv(2) calls. When a session
has been completed a close(2)
may be performed. Out-of-band data may also be transmitted as described in
send(2) and received as
described in recv(2).
The communications protocols used to implement a
SOCK_STREAM ensure that data is not lost or
duplicated. If a piece of data for which the peer protocol has buffer space
cannot be successfully transmitted within a reasonable length of time, then
the connection is considered broken and calls will indicate an error with -1
returns and with ETIMEDOUT as the specific code in
the global variable errno. The protocols optionally
keep sockets “warm” by forcing transmissions roughly every
minute in the absence of other activity. An error is then indicated if no
response can be elicited on an otherwise idle connection for an extended
period (e.g., 5 minutes). A SIGPIPE signal is raised
if a process sends on a broken stream; this causes naive processes, which do
not handle the signal, to exit.
SOCK_SEQPACKET sockets employ the same
system calls as SOCK_STREAM sockets. The only
difference is that read(2) calls
will return only the amount of data requested, and any remaining in the
arriving packet will be discarded.
SOCK_DGRAM and
SOCK_RAW sockets allow sending of datagrams to
correspondents named in send(2)
calls. Datagrams are generally received with
recvfrom(2), which returns
the next datagram with its return address.
An fcntl(2) call can
be used to specify a process group to receive a
SIGURG signal when the out-of-band data arrives. It
may also enable non-blocking I/O and asynchronous notification of I/O events
via SIGIO.
The operation of sockets is controlled by socket level options. These options are defined in the file ⟨sys/socket.h⟩. The setsockopt(2) and getsockopt(2) system calls are used to set and get options, respectively.
A -1 is returned if an error occurs, otherwise the return value is a descriptor referencing the socket.
The socket() call fails if:
EACCES]EAFNOSUPPORT]EMFILE]ENFILE]ENOBUFS]EPROTONOSUPPORT]EPROTOTYPE]accept(2), bind(2), connect(2), fcntl(2), getsockname(2), getsockopt(2), ioctl(2), listen(2), poll(2), read(2), recv(2), select(2), send(2), setsockopt(2), shutdown(2), socketpair(2), write(2), getprotoent(3)
Stuart Sechrest, An Introductory 4.4BSD Interprocess Communication Tutorial. (see /usr/share/doc/reference/ref3/sockets)
Samuel J. Leffler, Robert S. Fabry, William N. Joy, Phil Lapsley, Steve Miller, and Chris Torek, Advanced 4.4BSD IPC Tutorial. (see /usr/share/doc/reference/ref3/sockets-advanced)
The socket() call conforms to
IEEE Std 1003.1-2001 (“POSIX.1”).
Including the SOCK_CLOEXEC,
SOCK_CLOFORK, and
SOCK_NONBLOCK flags in the
type conforms to IEEE Std 1003.1-2024
(“POSIX.1”). Using
SOCK_NOSIGPIPE is an extension to the standard.
The socket() function call appeared in
4.2BSD.
The SOCK_CLOFORK flag appeared in
FreeBSD 15.0, DragonFly 6.5,
and NetBSD 11.0.
| July 17, 2025 | NetBSD 11.0 |