'\" t .\" Copyright (c) 1983, 1991 The Regents of the University of California. .\" All rights reserved. .\" .\" %%%LICENSE_START(BSD_4_CLAUSE_UCB) .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" %%%LICENSE_END .\" .\" $Id: socket.2,v 1.4 1999/05/13 11:33:42 freitag Exp $ .\" .\" Modified 1993-07-24 by Rik Faith .\" Modified 1996-10-22 by Eric S. Raymond .\" Modified 1998, 1999 by Andi Kleen .\" Modified 2002-07-17 by Michael Kerrisk .\" Modified 2004-06-17 by Michael Kerrisk .\" .TH SOCKET 2 2017-09-15 "Linux" "Linux Programmer's Manual" .SH NAME socket \- create an endpoint for communication .SH SYNOPSIS .BR "#include " " /* See NOTES */" .br .B #include .PP .BI "int socket(int " domain ", int " type ", int " protocol ); .SH DESCRIPTION .BR socket () creates an endpoint for communication and returns a file descriptor that refers to that endpoint. The file descriptor returned by a successful call will be the lowest-numbered file descriptor not currently open for the process. .PP The .I domain argument specifies a communication domain; this selects the protocol family which will be used for communication. These families are defined in .IR . The currently understood formats include: .TS tab(:); l l l. Name:Purpose:Man page T{ .BR AF_UNIX ", " AF_LOCAL T}:T{ Local communication T}:T{ .BR unix (7) T} T{ .B AF_INET T}:IPv4 Internet protocols:T{ .BR ip (7) T} T{ .B AF_AX25 T}:T{ Amateur radio AX.25 protocol T}:T{ .\" Part of ax25-tools .BR ax25 (4) T} T{ .B AF_IPX T}:IPX \- Novell protocols: T{ .B AF_APPLETALK T}:AppleTalk:T{ .BR ddp (7) T} T{ .B AF_NETROM T}:T{ AX.25 packet layer protocol T}:T{ .\" Part of ax25-tools package .BR netrom (4), [1] T} T{ .B AF_BRIDGE T}:T{ Can't be used for creating sockets; mostly used for bridge links in .BR rtnetlink (7) protocol commands. T} T{ .B AF_ATMPVC T}:T{ Access to raw ATM Permanent Virtual Circuits (PVCs) T}:T{ [2] T} T{ .B AF_X25 T}:ITU-T X.25 / ISO-8208 protocol:T{ .BR x25 (7) T} T{ .B AF_INET6 T}:IPv6 Internet protocols:T{ .BR ipv6 (7) T} T{ .B AF_ROSE T}:T{ RATS (Radio Amateur Telecommunications Society) Open Systems environment (ROSE) AX.25 packet layer protocol. T}:T{ .\" Part of ax25-tools package .BR netrom (4), [1] T} T{ .B AF_DECnet T}:T{ DECet protocol sockets. T}:T{ [3] T} T{ .B AF_NETBEUI T}:T{ Reserved for "802.2LLC project", never used. T} T{ .B AF_SECURITY T}:T{ Was a short-lived (between Linux 2.1.30 and 2.1.99pre2) protocol family for firewall upcalls. T} T{ .B AF_KEY T}:T{ Key management protocol, originally developed for usage with IPsec. Has no relation to .BR keyctl (2) and related in-kernel key storage facility. (since Linux 2.1.38.) T}:T{ [4] T} T{ .B AF_NETLINK T}:T{ Kernel user interface device T}:T{ .BR netlink (7) T} T{ .B AF_PACKET T}:T{ Low level packet interface T}:T{ .BR packet (7) T} .\" I haven't found any concrete information about this one; .\" it never was implemented in Linux, at least, judging by historical .\" repos. There is also this file (and its variations): .\" https://github.com/ecki/net-tools/blob/master/lib/ash.c .\" ( https://github.com/ecki/net-tools/commits/master/lib/ash.c ) .\" it mentions "NET-2 distribution" (BSD Net/2?), but, again, I failed .\" to find any mentions of "ash" protocol there. .\" (for the reference: .\" ftp://pdp11.org.ru/pub/unix-archive/Distributions/UCB/Net2/net2.tar.gz ) .\" Another source that mentions it is .\" https://www.silabs.com/documents/public/user-guides/ug101-uart-gateway-protocol-reference.pdf .\" https://www.silabs.com/documents/public/user-guides/ug115-ashv3-protocol-reference.pdf .\" but I doubt that it's related, as former files use 64-byte addresses and .\" "Hamming-encode of hops", and that's barely combines with a protocol .\" that is mainly used over serial connection. .\" T{ .\" .B AF_ASH .\" T}:T{ .\" Asynchronous Serial Host protocol (?) .\" T} T{ .B AF_ECONET T}:T{ .\" commit: 349f29d841dbae854bd7367be7c250401f974f47 Acorn Econet protocol (removed in Linux 3.5) T}:T{ [5] T} T{ .B AF_ATMSVC T}:T{ Access to ATM Switched Virtual Circuits (SVCs) T}:T{ [2] T} T{ .B AF_RDS T}:T{ .\" commit: 639b321b4d8f4e412bfbb2a4a19bfebc1e68ace4 Reliable Datagram Sockets (RDS) protocol (since Linux 2.6.30). RDS over RDMA has no relation to .B AF_SMC and/or .BR AF_XDP . T}:T{ .\" rds-tools: https://github.com/oracle/rds-tools/blob/master/rds.7 .\" rds-tools: https://github.com/oracle/rds-tools/blob/master/rds-rdma.7 .BR rds "(7), " rds-rdma (7), [6] T} T{ .B AF_IRDA T}:T{ .\" commits: 1ca163afb6fd569b, d64c2a76123f0300 Socket interface over IrDA (moved to staging in Linux 4.14, removed in Linux 4.17) T}:T{ .\" irda-utils: https://sourceforge.net/p/irda/code/HEAD/tree/tags/IRDAUTILS_0_9_18/irda-utils/man/irda.7.gz?format=raw .BR irda (7) T} T{ .B AF_PPPOX T}:T{ Generic PPP transport layer, for setting up up L2 tunnels (L2TP and PPPoE). T}:T{ [7] T} T{ .B AF_WANPIPE T}:T{ .\" commits: ce0ecd594d78710422599918a608e96dd1ee6024 Legacy protocol for wide area network (WAN) connectivity that was used by Sangoma WAN cards (called "WANPIPE"). Removed in Linux 2.6.21. T} T{ .B AF_LLC T}:T{ .\" linux-history commit: 34beb106cde7da233d4df35dd3d6cf4fee937caa Logical link control (IEEE 802.2 LLC) protocol, upper part of data link layer of ISO/OSI networking protocol stack (since Linux 2.4). Has no relation to .BR AF_PACKET . T}:T{ [8] T} T{ .B AF_IB T}:T{ .\" commits: 8d36eb01da5d371f..ce117ffac2e93334 InfiniBand native addressing (since Linux 3.11) T} T{ .B AF_MPLS T}:T{ .\" commits: 0189197f441602acdca3f97750d392a895b778fd Multiprotocol Label Switching configu (since Linux 4.1); mostly used for configuring MPLS routing via .BR netlink (7), as it doesn't expose ability to create sockets to user space. T} T{ .B AF_CAN T}:T{ .\" commits: 8dbde28d9711475a..5423dd67bd0108a1 Controller Area Network automotive bus protocol (since Linux 2.6.25) T}:T{ [9] T} T{ .B AF_TIPC T}:T{ .\" commits: b97bf3fd8f6a16966d4f18983b2c40993ff937d4 TIPC, "cluster domain sockets" protocol (since Linux 2.6.16) T}:T{ [10] T} T{ .B AF_BLUETOOTH T}:T{ .\" commits: 8d36eb01da5d371f..ce117ffac2e93334 Bluetooth low-level socket protocol (since Linux 3.11) T}:T{ [11] T} T{ .B AF_IUCV T}:T{ .\" commit: eac3731bd04c7131478722a3c148b78774553116 IUCV (inter-user communication vehicle) z/VM protocol for hypervisor-guest interaction (since Linux 2.6.21). Has no relation to .B AF_VSOCK and/or .BR AF_SMC . T}:T{ [12] T} T{ .B AF_RXRPC T}:T{ .\" commit: 17926a79320afa9b95df6b977b40cca6d8713cea .\" http://people.redhat.com/~dhowells/rxrpc/ .\" https://www.infradead.org/~dhowells/kafs/af_rxrpc_client.html .\" http://workshop.openafs.org/afsbpw09/talks/thu_2/kafs.pdf .\" http://pages.cs.wisc.edu/~remzi/OSTEP/dist-afs.pdf .\" http://web.mit.edu/kolya/afs/rx/rx-spec Rx, Andrew File System remote procedure call protocol (since Linux 2.6.22) T}:T{ [13] T} T{ .B AF_ISDN T}:T{ .\" commit: 1b2b03f8e514e4f68e293846ba511a948b80243c New "modular ISDN" driver interface protocol (since Linux 2.6.27) T}:T{ [14] T} T{ .B AF_PHONET T}:T{ .\" commit: 4b07b3f69a8471cdc142c51461a331226fef248a Nokia cellular modem IPC/RPC interface (since Linux 2.6.31) T}:T{ [15] T} T{ .B AF_IEEE802154 T}:T{ .\" commit: 9ec7671603573ede31207eb5b0b3e1aa211b2854 IEEE 802.15.4 WPAN (wireless personal area network) raw packet protocol (since Linux 2.6.31) T}:T{ [16] T} T{ .B AF_CAIF T}:T{ .\" commit: 529d6dad5bc69de14cdd24831e2a14264e93daa4 .\" https://lwn.net/Articles/371017/ .\" http://read.pudn.com/downloads157/doc/comm/698729/Misc/caif/Com%20CPU%20to%20Appl%20CPU%20Interface%20DESCRIPTION_LZN901%202002_revR1C.pdf .\" http://read.pudn.com/downloads157/doc/comm/698729/Misc/caif/Com%20CPU%20to%20Appl%20CPU%20Interface%20PROTOCOL%20SPECIFICATION_LZN901%201708_revR1A.pdf Ericsson's Communication CPU to Application CPU interface (CAIF) protocol (since Linux 2.6.36) T}:T{ [17] T} T{ .B AF_ALG T}:T{ .\" commit: 03c8efc1ffeb6b82a22c1af8dd908af349563314 Interface to kernel crypto API (since Linux 2.6.38) T}:T{ [18] T} T{ .B AF_VSOCK T}:T{ .\" commit: d021c344051af91f42c5ba9fdedc176740cbd238 VMWare VSockets protocol for hypervisor-guest interaction (since Linux 3.9). Has no relation to .B AF_IUCV and/or .BR AF_SMC . T}:T{ .BR vsock (7) T} T{ .B AF_KCM T}:T{ .\" commit: 03c8efc1ffeb6b82a22c1af8dd908af349563314 KCM (kernel connection multiplexor) interface (since Linux 4.6) T}:T{ [19] T} T{ .B AF_QIPCRTR T}:T{ .\" commit: bdabad3e363d825ddf9679dd431cca0b2c30f881 Qualcomm IPC router interface protocol (since Linux 4.7) T} T{ .B AF_SMC T}:T{ .\" commit: f3a3e248f3f7cd9a4bed334022704d7e7fc781bf SMC-R (shared memory communications over RDMA) protocol (since Linux 4.11), and SMC-D (shared memory communications, direct memory access) protocol for intra-node z/VM quest interaction (since Linux 4.19). Has no relation to .BR AF_RDS ", " AF_IUCV and/org .BR AF_VSOCK . T}:T{ [20] T} T{ .B AF_XDP T}:T{ .\" commit: c0c77d8fb787cfe0c3fca689c2a30d1dad4eaba7 XDP (express data path) interface (since Linux 4.18) T}:T{ [21] T} .TE .TP 5 [1] See .UR https://www.tldp.org/HOWTO/AX25-HOWTO/x61.html .I The Packet Radio Protocols and Linux .UE and .UR https://www.tldp.org/HOWTO/AX25-HOWTO/x2107.html .I AX.25, NET/ROM, ROSE network programming .UE chapters of .I Linux Amateur Radio AX.25 HOWTO for details. .TQ [2] See .UR https://www.tldp.org/HOWTO/text/ATM-Linux-HOWTO .I ATM on Linux HOWTO .UE for details. .TQ [3] See .I Documentation/networking/decnet.txt in the Linux kernel source tree for details. .TQ [4] See .UR https://tools.ietf.org/html/rfc2367 RFC 2367 .I PF_KEY Key Management API, Version 2 .UE for details. .TQ [5] See .UR http://www.8bs.com/othrdnld/manuals/econet.shtml Econet documentation .UE for details. .TQ [6] See .I Documentation/networking/rds.txt in the Linux kernel source tree for details. .TQ [7] See .I Documentation/networking/l2tp.txt in the Linux kernel source tree for details. .TQ [8] See chapter .I 13.5.3. Logical Link Control in .I Understanding Linux Kernel Internals (O'Reilly Media, 2006) and .I IEEE Standards for Local Area Networks: Logical Link Control (The Institute of Electronics and Electronics Engineers, Inc., New York, New York, 1985) for details. See also .UR https://wiki.linuxfoundation.org/networking/llc some historic notes .UE regarding its development. .TQ [9] See .I Documentation/networking/can.rst in the Linux kernel source tree for details. .TQ [10] See .UR http://tipc.io/programming.html .I TIPC Programmer's Guide .UE and .UR http://tipc.io/protocol.html protocol description .UE for details. .TQ [11] See .UR https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/mgmt-api.txt .I Bluetooth Management API overview .UE and .UR https://people.csail.mit.edu/albert/bluez-intro/ .I An Introduction to Bluetooth Programming by Albert Huang .UE for details. .TQ [12] See .UR https://www.ibm.com/support/knowledgecenter/en/SSB27U_6.4.0/com.ibm.zvm.v640.hcpb4/iucv.htm .I IUCV protocol overview .UE for details. .TQ [13] See .I Documentation/networking/rxrpc.txt in the Linux kernel source tree for details. .TQ [14] See .UR http://www.misdn.eu/wiki/Main_Page/ mISDN wiki .UE for details. .TQ [15] See .I Documentation/networking/phonet.txt in the Linux kernel source tree for details. .TQ [16] See .I Documentation/networking/ieee802154.txt in the Linux kernel source tree for details. .TQ [17] See .I Documentation/networking/caif/Linux-CAIF.txt in the Linux kernel source tree for details. .TQ [18] See .I Documentation/crypto/userspace-if.rst in the Linux kernel source tree for details. .TQ [19] See .I Documentation/networking/kcm.txt in the Linux kernel source tree for details. .TQ [20] See .UR https://tools.ietf.org/html/rfc7609 RFC 7609 .I IBM's Shared Memory Communications over RDMA (SMC-R) Protocol .UE for details regarding SMC-R. See .UR https://www-01.ibm.com/software/network/commserver/SMC-D/index.html .I SMC-D Reference Information .UE for details regarding SMC-D. .TQ [21] See .I Documentation/networking/af_xdp.rst in the Linux kernel source tree for details. .PP The socket has the indicated .IR type , which specifies the communication semantics. Currently defined types are: .TP 16 .B SOCK_STREAM Provides sequenced, reliable, two-way, connection-based byte streams. An out-of-band data transmission mechanism may be supported. .TP .B SOCK_DGRAM Supports datagrams (connectionless, unreliable messages of a fixed maximum length). .TP .B SOCK_SEQPACKET Provides a sequenced, reliable, two-way connection-based data transmission path for datagrams of fixed maximum length; a consumer is required to read an entire packet with each input system call. .TP .B SOCK_RAW Provides raw network protocol access. .TP .B SOCK_RDM Provides a reliable datagram layer that does not guarantee ordering. .TP .B SOCK_PACKET Obsolete and should not be used in new programs; see .BR packet (7). .PP Some socket types may not be implemented by all protocol families. .PP Since Linux 2.6.27, the .I type argument serves a second purpose: in addition to specifying a socket type, it may include the bitwise OR of any of the following values, to modify the behavior of .BR socket (): .TP 16 .B SOCK_NONBLOCK Set the .BR O_NONBLOCK file status flag on the new open file description. Using this flag saves extra calls to .BR fcntl (2) to achieve the same result. .TP .B SOCK_CLOEXEC Set the close-on-exec .RB ( FD_CLOEXEC ) flag on the new file descriptor. See the description of the .B O_CLOEXEC flag in .BR open (2) for reasons why this may be useful. .PP The .I 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, in which case .I protocol can be specified as 0. 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 specific to the \*(lqcommunication domain\*(rq in which communication is to take place; see .BR protocols (5). See .BR getprotoent (3) on how to map protocol name strings to protocol numbers. .PP Sockets of type .B SOCK_STREAM are full-duplex byte streams. They do not preserve record boundaries. A stream socket must be in a .I connected state before any data may be sent or received on it. A connection to another socket is created with a .BR connect (2) call. Once connected, data may be transferred using .BR read (2) and .BR write (2) calls or some variant of the .BR send (2) and .BR recv (2) calls. When a session has been completed a .BR close (2) may be performed. Out-of-band data may also be transmitted as described in .BR send (2) and received as described in .BR recv (2). .PP The communications protocols which implement a .B 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 to be dead. When .B SO_KEEPALIVE is enabled on the socket the protocol checks in a protocol-specific manner if the other end is still alive. A .B SIGPIPE signal is raised if a process sends or receives on a broken stream; this causes naive processes, which do not handle the signal, to exit. .B SOCK_SEQPACKET sockets employ the same system calls as .B SOCK_STREAM sockets. The only difference is that .BR read (2) calls will return only the amount of data requested, and any data remaining in the arriving packet will be discarded. Also all message boundaries in incoming datagrams are preserved. .PP .B SOCK_DGRAM and .B SOCK_RAW sockets allow sending of datagrams to correspondents named in .BR sendto (2) calls. Datagrams are generally received with .BR recvfrom (2), which returns the next datagram along with the address of its sender. .PP .B SOCK_PACKET is an obsolete socket type to receive raw packets directly from the device driver. Use .BR packet (7) instead. .PP An .BR fcntl (2) .B F_SETOWN operation can be used to specify a process or process group to receive a .B SIGURG signal when the out-of-band data arrives or .B SIGPIPE signal when a .B SOCK_STREAM connection breaks unexpectedly. This operation may also be used to set the process or process group that receives the I/O and asynchronous notification of I/O events via .BR SIGIO . Using .B F_SETOWN is equivalent to an .BR ioctl (2) call with the .B FIOSETOWN or .B SIOCSPGRP argument. .PP When the network signals an error condition to the protocol module (e.g., using an ICMP message for IP) the pending error flag is set for the socket. The next operation on this socket will return the error code of the pending error. For some protocols it is possible to enable a per-socket error queue to retrieve detailed information about the error; see .B IP_RECVERR in .BR ip (7). .PP The operation of sockets is controlled by socket level .IR options . These options are defined in .IR . The functions .BR setsockopt (2) and .BR getsockopt (2) are used to set and get options, respectively. .SH RETURN VALUE On success, a file descriptor for the new socket is returned. On error, \-1 is returned, and .I errno is set appropriately. .SH ERRORS .TP .B EACCES Permission to create a socket of the specified type and/or protocol is denied. .TP .B EAFNOSUPPORT The implementation does not support the specified address family. .TP .B EINVAL Unknown protocol, or protocol family not available. .TP .B EINVAL .\" Since Linux 2.6.27 Invalid flags in .IR type . .TP .B EMFILE The per-process limit on the number of open file descriptors has been reached. .TP .B ENFILE The system-wide limit on the total number of open files has been reached. .TP .BR ENOBUFS " or " ENOMEM Insufficient memory is available. The socket cannot be created until sufficient resources are freed. .TP .B EPROTONOSUPPORT The protocol type or the specified protocol is not supported within this domain. .PP Other errors may be generated by the underlying protocol modules. .SH CONFORMING TO POSIX.1-2001, POSIX.1-2008, 4.4BSD. .PP The .B SOCK_NONBLOCK and .B SOCK_CLOEXEC flags are Linux-specific. .PP .BR socket () appeared in 4.2BSD. It is generally portable to/from non-BSD systems supporting clones of the BSD socket layer (including System\ V variants). .SH NOTES POSIX.1 does not require the inclusion of .IR , and this header file is not required on Linux. However, some historical (BSD) implementations required this header file, and portable applications are probably wise to include it. .PP The manifest constants used under 4.x BSD for protocol families are .BR PF_UNIX , .BR PF_INET , and so on, while .BR AF_UNIX , .BR AF_INET , and so on are used for address families. However, already the BSD man page promises: "The protocol family generally is the same as the address family", and subsequent standards use AF_* everywhere. .PP The .B AF_ALG protocol type was added in Linux 2.6.38. More information on this interface is provided with the kernel HTML documentation at .IR https://www.kernel.org/doc/htmldocs/crypto\-API/User.html . .PP The .B AF_XDP protocol type was added in Linux 4.18. More information on this interface is provided in the kernel source file .IR Documentation/networking/af_xdp.rst . .SH EXAMPLE An example of the use of .BR socket () is shown in .BR getaddrinfo (3). .SH SEE ALSO .BR accept (2), .BR bind (2), .BR close (2), .BR connect (2), .BR fcntl (2), .BR getpeername (2), .BR getsockname (2), .BR getsockopt (2), .BR ioctl (2), .BR listen (2), .BR read (2), .BR recv (2), .BR select (2), .BR send (2), .BR shutdown (2), .BR socketpair (2), .BR write (2), .BR getprotoent (3), .BR ip (7), .BR socket (7), .BR tcp (7), .BR udp (7), .BR unix (7) .PP \(lqAn Introductory 4.3BSD Interprocess Communication Tutorial\(rq and \(lqBSD Interprocess Communication Tutorial\(rq, reprinted in .I UNIX Programmer's Supplementary Documents Volume 1.