|
|
1.1 ! root 1: .\" Copyright (c) 1983 Regents of the University of California. ! 2: .\" All rights reserved. The Berkeley software License Agreement ! 3: .\" specifies the terms and conditions for redistribution. ! 4: .\" ! 5: .\" @(#)2.3.t 6.3 (Berkeley) 5/12/86 ! 6: .\" ! 7: .sh "Interprocess communications ! 8: .NH 3 ! 9: Interprocess communication primitives ! 10: .NH 4 ! 11: Communication domains ! 12: .PP ! 13: The system provides access to an extensible set of ! 14: communication \fIdomains\fP. A communication domain ! 15: is identified by a manifest constant defined in the ! 16: file \fI<sys/socket.h>\fP. ! 17: Important standard domains supported by the system are the ``unix'' ! 18: domain, AF_UNIX, for communication within the system, the ``Internet'' ! 19: domain for communication in the DARPA Internet, AF_INET, ! 20: and the ``NS'' domain, AF_NS, for communication ! 21: using the Xerox Network Systems protocols. ! 22: Other domains can be added to the system. ! 23: .NH 4 ! 24: Socket types and protocols ! 25: .PP ! 26: Within a domain, communication takes place between communication endpoints ! 27: known as \fIsockets\fP. Each socket has the potential to exchange ! 28: information with other sockets of an appropriate type within the domain. ! 29: .PP ! 30: Each socket has an associated ! 31: abstract type, which describes the semantics of communication using that ! 32: socket. Properties such as reliability, ordering, and prevention ! 33: of duplication of messages are determined by the type. ! 34: The basic set of socket types is defined in \fI<sys/socket.h>\fP: ! 35: .DS ! 36: /* Standard socket types */ ! 37: ._d ! 38: #define SOCK_DGRAM 1 /* datagram */ ! 39: #define SOCK_STREAM 2 /* virtual circuit */ ! 40: #define SOCK_RAW 3 /* raw socket */ ! 41: #define SOCK_RDM 4 /* reliably-delivered message */ ! 42: #define SOCK_SEQPACKET 5 /* sequenced packets */ ! 43: .DE ! 44: The SOCK_DGRAM type models the semantics of datagrams in network communication: ! 45: messages may be lost or duplicated and may arrive out-of-order. ! 46: A datagram socket may send messages to and receive messages from multiple ! 47: peers. ! 48: The SOCK_RDM type models the semantics of reliable datagrams: messages ! 49: arrive unduplicated and in-order, the sender is notified if ! 50: messages are lost. ! 51: The \fIsend\fP and \fIreceive\fP operations (described below) ! 52: generate reliable/unreliable datagrams. ! 53: The SOCK_STREAM type models connection-based virtual circuits: two-way ! 54: byte streams with no record boundaries. ! 55: Connection setup is required before data communication may begin. ! 56: The SOCK_SEQPACKET type models a connection-based, ! 57: full-duplex, reliable, sequenced packet exchange; ! 58: the sender is notified if messages are lost, and messages are never ! 59: duplicated or presented out-of-order. ! 60: Users of the last two abstractions may use the facilities for ! 61: out-of-band transmission to send out-of-band data. ! 62: .PP ! 63: SOCK_RAW is used for unprocessed access to internal network layers ! 64: and interfaces; it has no specific semantics. ! 65: .PP ! 66: Other socket types can be defined. ! 67: .PP ! 68: Each socket may have a specific \fIprotocol\fP associated with it. ! 69: This protocol is used within the domain to provide the semantics ! 70: required by the socket type. ! 71: Not all socket types are supported by each domain; ! 72: support depends on the existence and the implementation ! 73: of a suitable protocol within the domain. ! 74: For example, within the ``Internet'' domain, the SOCK_DGRAM type may be ! 75: implemented by the UDP user datagram protocol, and the SOCK_STREAM ! 76: type may be implemented by the TCP transmission control protocol, while ! 77: no standard protocols to provide SOCK_RDM or SOCK_SEQPACKET sockets exist. ! 78: .NH 4 ! 79: Socket creation, naming and service establishment ! 80: .PP ! 81: Sockets may be \fIconnected\fP or \fIunconnected\fP. An unconnected ! 82: socket descriptor is obtained by the \fIsocket\fP call: ! 83: .DS ! 84: s = socket(domain, type, protocol); ! 85: result int s; int domain, type, protocol; ! 86: .DE ! 87: The socket domain and type are as described above, ! 88: and are specified using the definitions from \fI<sys/socket.h>\fP. ! 89: The protocol may be given as 0, meaning any suitable protocol. ! 90: One of several possible protocols may be selected using identifiers ! 91: obtained from a library routine, \fIgetprotobyname\fP. ! 92: .PP ! 93: An unconnected socket descriptor of a connection-oriented type ! 94: may yield a connected socket descriptor ! 95: in one of two ways: either by actively connecting to another socket, ! 96: or by becoming associated with a name in the communications domain and ! 97: \fIaccepting\fP a connection from another socket. ! 98: Datagram sockets need not establish connections before use. ! 99: .PP ! 100: To accept connections or to receive datagrams, ! 101: a socket must first have a binding ! 102: to a name (or address) within the communications domain. ! 103: Such a binding may be established by a \fIbind\fP call: ! 104: .DS ! 105: bind(s, name, namelen); ! 106: int s; struct sockaddr *name; int namelen; ! 107: .DE ! 108: Datagram sockets may have default bindings established when first ! 109: sending data if not explicitly bound earlier. ! 110: In either case, ! 111: a socket's bound name may be retrieved with a \fIgetsockname\fP call: ! 112: .DS ! 113: getsockname(s, name, namelen); ! 114: int s; result struct sockaddr *name; result int *namelen; ! 115: .DE ! 116: while the peer's name can be retrieved with \fIgetpeername\fP: ! 117: .DS ! 118: getpeername(s, name, namelen); ! 119: int s; result struct sockaddr *name; result int *namelen; ! 120: .DE ! 121: Domains may support sockets with several names. ! 122: .NH 4 ! 123: Accepting connections ! 124: .PP ! 125: Once a binding is made to a connection-oriented socket, ! 126: it is possible to \fIlisten\fP for connections: ! 127: .DS ! 128: listen(s, backlog); ! 129: int s, backlog; ! 130: .DE ! 131: The \fIbacklog\fP specifies the maximum count of connections ! 132: that can be simultaneously queued awaiting acceptance. ! 133: .PP ! 134: An \fIaccept\fP call: ! 135: .DS ! 136: t = accept(s, name, anamelen); ! 137: result int t; int s; result struct sockaddr *name; result int *anamelen; ! 138: .DE ! 139: returns a descriptor for a new, connected, socket ! 140: from the queue of pending connections on \fIs\fP. ! 141: If no new connections are queued for acceptance, ! 142: the call will wait for a connection unless non-blocking I/O has been enabled. ! 143: .NH 4 ! 144: Making connections ! 145: .PP ! 146: An active connection to a named socket is made by the \fIconnect\fP call: ! 147: .DS ! 148: connect(s, name, namelen); ! 149: int s; struct sockaddr *name; int namelen; ! 150: .DE ! 151: Although datagram sockets do not establish connections, ! 152: the \fIconnect\fP call may be used with such sockets ! 153: to create an \fIassociation\fP with the foreign address. ! 154: The address is recorded for use in future \fIsend\fP calls, ! 155: which then need not supply destination addresses. ! 156: Datagrams will be received only from that peer, ! 157: and asynchronous error reports may be received. ! 158: .PP ! 159: It is also possible to create connected pairs of sockets without ! 160: using the domain's name space to rendezvous; this is done with the ! 161: \fIsocketpair\fP call\(dg: ! 162: .FS ! 163: \(dg 4.3BSD supports \fIsocketpair\fP creation only in the ``unix'' ! 164: communication domain. ! 165: .FE ! 166: .DS ! 167: socketpair(domain, type, protocol, sv); ! 168: int domain, type, protocol; result int sv[2]; ! 169: .DE ! 170: Here the returned \fIsv\fP descriptors correspond to those obtained with ! 171: \fIaccept\fP and \fIconnect\fP. ! 172: .PP ! 173: The call ! 174: .DS ! 175: pipe(pv) ! 176: result int pv[2]; ! 177: .DE ! 178: creates a pair of SOCK_STREAM sockets in the UNIX domain, ! 179: with pv[0] only writable and pv[1] only readable. ! 180: .NH 4 ! 181: Sending and receiving data ! 182: .PP ! 183: Messages may be sent from a socket by: ! 184: .DS ! 185: cc = sendto(s, buf, len, flags, to, tolen); ! 186: result int cc; int s; caddr_t buf; int len, flags; caddr_t to; int tolen; ! 187: .DE ! 188: if the socket is not connected or: ! 189: .DS ! 190: cc = send(s, buf, len, flags); ! 191: result int cc; int s; caddr_t buf; int len, flags; ! 192: .DE ! 193: if the socket is connected. ! 194: The corresponding receive primitives are: ! 195: .DS ! 196: msglen = recvfrom(s, buf, len, flags, from, fromlenaddr); ! 197: result int msglen; int s; result caddr_t buf; int len, flags; ! 198: result caddr_t from; result int *fromlenaddr; ! 199: .DE ! 200: and ! 201: .DS ! 202: msglen = recv(s, buf, len, flags); ! 203: result int msglen; int s; result caddr_t buf; int len, flags; ! 204: .DE ! 205: .PP ! 206: In the unconnected case, ! 207: the parameters \fIto\fP and \fItolen\fP ! 208: specify the destination or source of the message, while ! 209: the \fIfrom\fP parameter stores the source of the message, ! 210: and \fI*fromlenaddr\fP initially gives the size of the \fIfrom\fP ! 211: buffer and is updated to reflect the true length of the \fIfrom\fP ! 212: address. ! 213: .PP ! 214: All calls cause the message to be received in or sent from ! 215: the message buffer of length \fIlen\fP bytes, starting at address \fIbuf\fP. ! 216: The \fIflags\fP specify ! 217: peeking at a message without reading it or sending or receiving ! 218: high-priority out-of-band messages, as follows: ! 219: .DS ! 220: ._d ! 221: #define MSG_PEEK 0x1 /* peek at incoming message */ ! 222: #define MSG_OOB 0x2 /* process out-of-band data */ ! 223: .DE ! 224: .NH 4 ! 225: Scatter/gather and exchanging access rights ! 226: .PP ! 227: It is possible scatter and gather data and to exchange access rights ! 228: with messages. When either of these operations is involved, ! 229: the number of parameters to the call becomes large. ! 230: Thus the system defines a message header structure, in \fI<sys/socket.h>\fP, ! 231: which can be ! 232: used to conveniently contain the parameters to the calls: ! 233: .DS ! 234: .if t .ta .5i 1.25i 2i 2.7i ! 235: .if n ._f ! 236: struct msghdr { ! 237: caddr_t msg_name; /* optional address */ ! 238: int msg_namelen; /* size of address */ ! 239: struct iov *msg_iov; /* scatter/gather array */ ! 240: int msg_iovlen; /* # elements in msg_iov */ ! 241: caddr_t msg_accrights; /* access rights sent/received */ ! 242: int msg_accrightslen; /* size of msg_accrights */ ! 243: }; ! 244: .DE ! 245: Here \fImsg_name\fP and \fImsg_namelen\fP specify the source or destination ! 246: address if the socket is unconnected; \fImsg_name\fP may be given as ! 247: a null pointer if no names are desired or required. ! 248: The \fImsg_iov\fP and \fImsg_iovlen\fP describe the scatter/gather ! 249: locations, as described in section 2.1.3. ! 250: Access rights to be sent along with the message are specified ! 251: in \fImsg_accrights\fP, which has length \fImsg_accrightslen\fP. ! 252: In the ``unix'' domain these are an array of integer descriptors, ! 253: taken from the sending process and duplicated in the receiver. ! 254: .PP ! 255: This structure is used in the operations \fIsendmsg\fP and \fIrecvmsg\fP: ! 256: .DS ! 257: sendmsg(s, msg, flags); ! 258: int s; struct msghdr *msg; int flags; ! 259: ! 260: msglen = recvmsg(s, msg, flags); ! 261: result int msglen; int s; result struct msghdr *msg; int flags; ! 262: .DE ! 263: .NH 4 ! 264: Using read and write with sockets ! 265: .PP ! 266: The normal UNIX \fIread\fP and \fIwrite\fP calls may be ! 267: applied to connected sockets and translated into \fIsend\fP and \fIreceive\fP ! 268: calls from or to a single area of memory and discarding any rights ! 269: received. A process may operate on a virtual circuit socket, a terminal ! 270: or a file with blocking or non-blocking input/output ! 271: operations without distinguishing the descriptor type. ! 272: .NH 4 ! 273: Shutting down halves of full-duplex connections ! 274: .PP ! 275: A process that has a full-duplex socket such as a virtual circuit ! 276: and no longer wishes to read from or write to this socket can ! 277: give the call: ! 278: .DS ! 279: shutdown(s, direction); ! 280: int s, direction; ! 281: .DE ! 282: where \fIdirection\fP is 0 to not read further, 1 to not ! 283: write further, or 2 to completely shut the connection down. ! 284: If the underlying protocol supports unidirectional or bidirectional shutdown, ! 285: this indication will be passed to the peer. ! 286: For example, a shutdown for writing might produce an end-of-file ! 287: condition at the remote end. ! 288: .NH 4 ! 289: Socket and protocol options ! 290: .PP ! 291: Sockets, and their underlying communication protocols, may ! 292: support \fIoptions\fP. These options may be used to manipulate ! 293: implementation- or protocol-specific facilities. ! 294: The \fIgetsockopt\fP ! 295: and \fIsetsockopt\fP calls are used to control options: ! 296: .DS ! 297: getsockopt(s, level, optname, optval, optlen) ! 298: int s, level, optname; result caddr_t optval; result int *optlen; ! 299: ! 300: setsockopt(s, level, optname, optval, optlen) ! 301: int s, level, optname; caddr_t optval; int optlen; ! 302: .DE ! 303: The option \fIoptname\fP is interpreted at the indicated ! 304: protocol \fIlevel\fP for socket \fIs\fP. If a value is specified ! 305: with \fIoptval\fP and \fIoptlen\fP, it is interpreted by ! 306: the software operating at the specified \fIlevel\fP. The \fIlevel\fP ! 307: SOL_SOCKET is reserved to indicate options maintained ! 308: by the socket facilities. Other \fIlevel\fP values indicate ! 309: a particular protocol which is to act on the option request; ! 310: these values are normally interpreted as a ``protocol number''. ! 311: .NH 3 ! 312: UNIX domain ! 313: .PP ! 314: This section describes briefly the properties of the UNIX communications ! 315: domain. ! 316: .NH 4 ! 317: Types of sockets ! 318: .PP ! 319: In the UNIX domain, ! 320: the SOCK_STREAM abstraction provides pipe-like ! 321: facilities, while SOCK_DGRAM provides (usually) ! 322: reliable message-style communications. ! 323: .NH 4 ! 324: Naming ! 325: .PP ! 326: Socket names are strings and may appear in the UNIX file ! 327: system name space through portals\(dg. ! 328: .FS ! 329: \(dg The 4.3BSD implementation of the UNIX domain embeds ! 330: bound sockets in the UNIX file system name space; ! 331: this may change in future releases. ! 332: .FE ! 333: .NH 4 ! 334: Access rights transmission ! 335: .PP ! 336: The ability to pass UNIX descriptors with messages in this domain ! 337: allows migration of service within the system and allows ! 338: user processes to be used in building system facilities. ! 339: .NH 3 ! 340: INTERNET domain ! 341: .PP ! 342: This section describes briefly how the Internet domain is ! 343: mapped to the model described in this section. More ! 344: information will be found in the document describing the ! 345: network implementation in 4.3BSD. ! 346: .NH 4 ! 347: Socket types and protocols ! 348: .PP ! 349: SOCK_STREAM is supported by the Internet TCP protocol; ! 350: SOCK_DGRAM by the UDP protocol. ! 351: Each is layered atop the transport-level Internet Protocol (IP). ! 352: The Internet Control Message Protocol is implemented atop/beside IP ! 353: and is accessible via a raw socket. ! 354: The SOCK_SEQPACKET ! 355: has no direct Internet family analogue; a protocol ! 356: based on one from the XEROX NS family and layered on ! 357: top of IP could be implemented to fill this gap. ! 358: .NH 4 ! 359: Socket naming ! 360: .PP ! 361: Sockets in the Internet domain have names composed of the 32 bit ! 362: Internet address, and a 16 bit port number. ! 363: Options may be used to ! 364: provide IP source routing or security options. ! 365: The 32-bit address is composed of network and host parts; ! 366: the network part is variable in size and is frequency encoded. ! 367: The host part may optionally be interpreted as a subnet field ! 368: plus the host on subnet; this is is enabled by setting a network address ! 369: mask at boot time. ! 370: .NH 4 ! 371: Access rights transmission ! 372: .PP ! 373: No access rights transmission facilities are provided in the Internet domain. ! 374: .NH 4 ! 375: Raw access ! 376: .PP ! 377: The Internet domain allows the super-user access to the raw facilities ! 378: of IP. ! 379: These interfaces are modeled as SOCK_RAW sockets. ! 380: Each raw socket is associated with one IP protocol number, ! 381: and receives all traffic received for that protocol. ! 382: This allows administrative and debugging ! 383: functions to occur, ! 384: and enables user-level implementations of special-purpose protocols ! 385: such as inter-gateway routing protocols.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.