|
|
1.1 root 1: .\" Copyright (c) 1986 The Regents of the University of California.
2: .\" All rights reserved.
3: .\"
4: .\" Redistribution and use in source and binary forms are permitted
5: .\" provided that the above copyright notice and this paragraph are
6: .\" duplicated in all such forms and that any documentation,
7: .\" advertising materials, and other materials related to such
8: .\" distribution and use acknowledge that the software was developed
9: .\" by the University of California, Berkeley. The name of the
10: .\" University may not be used to endorse or promote products derived
11: .\" from this software without specific prior written permission.
12: .\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
13: .\" IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
14: .\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
15: .\"
16: .\" @(#)2.t 1.4 (Berkeley) 3/7/89
17: .\"
18: .\".ds RH "Basics
19: .bp
20: .nr H1 2
21: .nr H2 0
22: .bp
23: .LG
24: .B
25: .ce
26: 2. BASICS
27: .sp 2
28: .R
29: .NL
30: .PP
31: The basic building block for communication is the \fIsocket\fP.
32: A socket is an endpoint of communication to which a name may
33: be \fIbound\fP. Each socket in use has a \fItype\fP
34: and one or more associated processes. Sockets exist within
35: \fIcommunication domains\fP.
36: A communication domain is an
37: abstraction introduced to bundle common properties of
38: processes communicating through sockets.
39: One such property is the scheme used to name sockets. For
40: example, in the UNIX communication domain sockets are
41: named with UNIX path names; e.g. a
42: socket may be named \*(lq/dev/foo\*(rq. Sockets normally
43: exchange data only with
44: sockets in the same domain (it may be possible to cross domain
45: boundaries, but only if some translation process is
46: performed). The
47: 4.3BSD IPC facilities support three separate communication domains:
48: the UNIX domain, for on-system communication;
49: the Internet domain, which is used by
50: processes which communicate
51: using the the DARPA standard communication protocols;
52: and the NS domain, which is used by processes which
53: communicate using the Xerox standard communication
54: protocols*.
55: .FS
56: * See \fIInternet Transport Protocols\fP, Xerox System Integration
57: Standard (XSIS)028112 for more information. This document is
58: almost a necessity for one trying to write NS applications.
59: .FE
60: The underlying communication
61: facilities provided by these domains have a significant influence
62: on the internal system implementation as well as the interface to
63: socket facilities available to a user. An example of the
64: latter is that a socket \*(lqoperating\*(rq in the UNIX domain
65: sees a subset of the error conditions which are possible
66: when operating in the Internet (or NS) domain.
67: .NH 2
68: Socket types
69: .PP
70: Sockets are
71: typed according to the communication properties visible to a
72: user.
73: Processes are presumed to communicate only between sockets of
74: the same type, although there is
75: nothing that prevents communication between sockets of different
76: types should the underlying communication
77: protocols support this.
78: .PP
79: Four types of sockets currently are available to a user.
80: A \fIstream\fP socket provides for the bidirectional, reliable,
81: sequenced, and unduplicated flow of data without record boundaries.
82: Aside from the bidirectionality of data flow, a pair of connected
83: stream sockets provides an interface nearly identical to that of pipes\(dg.
84: .FS
85: \(dg In the UNIX domain, in fact, the semantics are identical and,
86: as one might expect, pipes have been implemented internally
87: as simply a pair of connected stream sockets.
88: .FE
89: .PP
90: A \fIdatagram\fP socket supports bidirectional flow of data which
91: is not promised to be sequenced, reliable, or unduplicated.
92: That is, a process
93: receiving messages on a datagram socket may find messages duplicated,
94: and, possibly,
95: in an order different from the order in which it was sent.
96: An important characteristic of a datagram
97: socket is that record boundaries in data are preserved. Datagram
98: sockets closely model the facilities found in many contemporary
99: packet switched networks such as the Ethernet.
100: .PP
101: A \fIraw\fP socket provides users access to
102: the underlying communication
103: protocols which support socket abstractions.
104: These sockets are normally datagram oriented, though their
105: exact characteristics are dependent on the interface provided by
106: the protocol. Raw sockets are not intended for the general user; they
107: have been provided mainly for those interested in developing new
108: communication protocols, or for gaining access to some of the more
109: esoteric facilities of an existing protocol. The use of raw sockets
110: is considered in section 5.
111: .PP
112: A \fIsequenced packet\fP socket is similar to a stream socket,
113: with the exception that record boundaries are preserved. This
114: interface is provided only as part of the NS socket abstraction,
115: and is very important in most serious NS applications.
116: Sequenced-packet sockets allow the user to manipulate the
117: SPP or IDP headers on a packet or a group of packets either
118: by writing a prototype header along with whatever data is
119: to be sent, or by specifying a default header to be used with
120: all outgoing data, and allows the user to receive the headers
121: on incoming packets. The use of these options is considered in
122: section 5.
123: .PP
124: Another potential socket type which has interesting properties is
125: the \fIreliably delivered
126: message\fP socket.
127: The reliably delivered message socket has
128: similar properties to a datagram socket, but with
129: reliable delivery. There is currently no support for this
130: type of socket, but a reliably delivered message protocol
131: similar to Xerox's Packet Exchange Protocol (PEX) may be
132: simulated at the user level. More information on this topic
133: can be found in section 5.
134: .NH 2
135: Socket creation
136: .PP
137: To create a socket the \fIsocket\fP system call is used:
138: .DS
139: s = socket(domain, type, protocol);
140: .DE
141: This call requests that the system create a socket in the specified
142: \fIdomain\fP and of the specified \fItype\fP. A particular protocol may
143: also be requested. If the protocol is left unspecified (a value
144: of 0), the system will select an appropriate protocol from those
145: protocols which comprise the communication domain and which
146: may be used to support the requested socket type. The user is
147: returned a descriptor (a small integer number) which may be used
148: in later system calls which operate on sockets. The domain is specified as
149: one of the manifest constants defined in the file <\fIsys/socket.h\fP>.
150: For the UNIX domain the constant is AF_UNIX*; for the Internet
151: .FS
152: * The manifest constants are named AF_whatever as they indicate
153: the ``address format'' to use in interpreting names.
154: .FE
155: domain AF_INET; and for the NS domain, AF_NS.
156: The socket types are also defined in this file
157: and one of SOCK_STREAM, SOCK_DGRAM, SOCK_RAW, or SOCK_SEQPACKET
158: must be specified.
159: To create a stream socket in the Internet domain the following
160: call might be used:
161: .DS
162: s = socket(AF_INET, SOCK_STREAM, 0);
163: .DE
164: This call would result in a stream socket being created with the TCP
165: protocol providing the underlying communication support. To
166: create a datagram socket for on-machine use the call might
167: be:
168: .DS
169: s = socket(AF_UNIX, SOCK_DGRAM, 0);
170: .DE
171: .PP
172: The default protocol (used when the \fIprotocol\fP argument to the
173: \fIsocket\fP call is 0) should be correct for most every
174: situation. However, it is possible to specify a protocol
175: other than the default; this will be covered in
176: section 5.
177: .PP
178: There are several reasons a socket call may fail. Aside from
179: the rare occurrence of lack of memory (ENOBUFS), a socket
180: request may fail due to a request for an unknown protocol
181: (EPROTONOSUPPORT), or a request for a type of socket for
182: which there is no supporting protocol (EPROTOTYPE).
183: .NH 2
184: Binding local names
185: .PP
186: A socket is created without a name. Until a name is bound
187: to a socket, processes have no way to reference it and, consequently,
188: no messages may be received on it.
189: Communicating processes are bound
190: by an \fIassociation\fP. In the Internet and NS domains,
191: an association
192: is composed of local and foreign
193: addresses, and local and foreign ports,
194: while in the UNIX domain, an association is composed of
195: local and foreign path names (the phrase ``foreign pathname''
196: means a pathname created by a foreign process, not a pathname
197: on a foreign system).
198: In most domains, associations must be unique.
199: In the Internet domain there
200: may never be duplicate <protocol, local address, local port, foreign
201: address, foreign port> tuples. UNIX domain sockets need not always
202: be bound to a name, but when bound
203: there may never be duplicate <protocol, local pathname, foreign
204: pathname> tuples.
205: The pathnames may not refer to files
206: already existing on the system
207: in 4.3; the situation may change in future releases.
208: .PP
209: The \fIbind\fP system call allows a process to specify half of
210: an association, <local address, local port>
211: (or <local pathname>), while the \fIconnect\fP
212: and \fIaccept\fP primitives are used to complete a socket's association.
213: .PP
214: In the Internet domain,
215: binding names to sockets can be fairly complex.
216: Fortunately, it is usually not necessary to specifically bind an
217: address and port number to a socket, because the
218: \fIconnect\fP and \fIsend\fP calls will automatically
219: bind an appropriate address if they are used with an
220: unbound socket. The process of binding names to NS
221: sockets is similar in most ways to that of
222: binding names to Internet sockets.
223: .PP
224: The \fIbind\fP system call is used as follows:
225: .DS
226: bind(s, name, namelen);
227: .DE
228: The bound name is a variable length byte string which is interpreted
229: by the supporting protocol(s). Its interpretation may vary from
230: communication domain to communication domain (this is one of
231: the properties which comprise the \*(lqdomain\*(rq).
232: As mentioned, in the
233: Internet domain names contain an Internet address and port
234: number. NS domain names contain an NS address and
235: port number. In the UNIX domain, names contain a path name and
236: a family, which is always AF_UNIX. If one wanted to bind
237: the name \*(lq/tmp/foo\*(rq to a UNIX domain socket, the
238: following code would be used*:
239: .FS
240: * Note that, although the tendency here is to call the \*(lqaddr\*(rq
241: structure \*(lqsun\*(rq, doing so would cause problems if the code
242: were ever ported to a Sun workstation.
243: .FE
244: .DS
245: #include <sys/un.h>
246: ...
247: struct sockaddr_un addr;
248: ...
249: strcpy(addr.sun_path, "/tmp/foo");
250: addr.sun_family = AF_UNIX;
251: bind(s, (struct sockaddr *) &addr, strlen(addr.sun_path) +
252: sizeof (addr.sun_family));
253: .DE
254: Note that in determining the size of a UNIX domain address null
255: bytes are not counted, which is why \fIstrlen\fP is used. In
256: the current implementation of UNIX domain IPC under 4.3BSD,
257: the file name
258: referred to in \fIaddr.sun_path\fP is created as a socket
259: in the system file space.
260: The caller must, therefore, have
261: write permission in the directory where
262: \fIaddr.sun_path\fP is to reside, and this file should be deleted by the
263: caller when it is no longer needed. Future versions of 4BSD
264: may not create this file.
265: .PP
266: In binding an Internet address things become more
267: complicated. The actual call is similar,
268: .DS
269: #include <sys/types.h>
270: #include <netinet/in.h>
271: ...
272: struct sockaddr_in sin;
273: ...
274: bind(s, (struct sockaddr *) &sin, sizeof (sin));
275: .DE
276: but the selection of what to place in the address \fIsin\fP
277: requires some discussion. We will come back to the problem
278: of formulating Internet addresses in section 3 when
279: the library routines used in name resolution are discussed.
280: .PP
281: Binding an NS address to a socket is even more
282: difficult,
283: especially since the Internet library routines do not
284: work with NS hostnames. The actual call is again similar:
285: .DS
286: #include <sys/types.h>
287: #include <netns/ns.h>
288: ...
289: struct sockaddr_ns sns;
290: ...
291: bind(s, (struct sockaddr *) &sns, sizeof (sns));
292: .DE
293: Again, discussion of what to place in a \*(lqstruct sockaddr_ns\*(rq
294: will be deferred to section 3.
295: .NH 2
296: Connection establishment
297: .PP
298: Connection establishment is usually asymmetric,
299: with one process a \*(lqclient\*(rq and the other a \*(lqserver\*(rq.
300: The server, when willing to offer its advertised services,
301: binds a socket to a well-known address associated with the service
302: and then passively \*(lqlistens\*(rq on its socket.
303: It is then possible for an unrelated process to rendezvous
304: with the server.
305: The client requests services from the server by initiating a
306: \*(lqconnection\*(rq to the server's socket.
307: On the client side the \fIconnect\fP call is
308: used to initiate a connection. Using the UNIX domain, this
309: might appear as,
310: .DS
311: struct sockaddr_un server;
312: ...
313: connect(s, (struct sockaddr *)&server, strlen(server.sun_path) +
314: sizeof (server.sun_family));
315: .DE
316: while in the Internet domain,
317: .DS
318: struct sockaddr_in server;
319: ...
320: connect(s, (struct sockaddr *)&server, sizeof (server));
321: .DE
322: and in the NS domain,
323: .DS
324: struct sockaddr_ns server;
325: ...
326: connect(s, (struct sockaddr *)&server, sizeof (server));
327: .DE
328: where \fIserver\fP in the example above would contain either the UNIX
329: pathname, Internet address and port number, or NS address and
330: port number of the server to which the
331: client process wishes to speak.
332: If the client process's socket is unbound at the time of
333: the connect call,
334: the system will automatically select and bind a name to
335: the socket if necessary; c.f. section 5.4.
336: This is the usual way that local addresses are bound
337: to a socket.
338: .PP
339: An error is returned if the connection was unsuccessful
340: (any name automatically bound by the system, however, remains).
341: Otherwise, the socket is associated with the server and
342: data transfer may begin. Some of the more common errors returned
343: when a connection attempt fails are:
344: .IP ETIMEDOUT
345: .br
346: After failing to establish a connection for a period of time,
347: the system decided there was no point in retrying the
348: connection attempt any more. This usually occurs because
349: the destination host is down, or because problems in
350: the network resulted in transmissions being lost.
351: .IP ECONNREFUSED
352: .br
353: The host refused service for some reason.
354: This is usually
355: due to a server process
356: not being present at the requested name.
357: .IP "ENETDOWN or EHOSTDOWN"
358: .br
359: These operational errors are
360: returned based on status information delivered to
361: the client host by the underlying communication services.
362: .IP "ENETUNREACH or EHOSTUNREACH"
363: .br
364: These operational errors can occur either because the network
365: or host is unknown (no route to the network or host is present),
366: or because of status information returned by intermediate
367: gateways or switching nodes. Many times the status returned
368: is not sufficient to distinguish a network being down from a
369: host being down, in which case the system
370: indicates the entire network is unreachable.
371: .PP
372: For the server to receive a client's connection it must perform
373: two steps after binding its socket.
374: The first is to indicate a willingness to listen for
375: incoming connection requests:
376: .DS
377: listen(s, 5);
378: .DE
379: The second parameter to the \fIlisten\fP call specifies the maximum
380: number of outstanding connections which may be queued awaiting
381: acceptance by the server process; this number
382: may be limited by the system. Should a connection be
383: requested while the queue is full, the connection will not be
384: refused, but rather the individual messages which comprise the
385: request will be ignored. This gives a harried server time to
386: make room in its pending connection queue while the client
387: retries the connection request. Had the connection been returned
388: with the ECONNREFUSED error, the client would be unable to tell
389: if the server was up or not. As it is now it is still possible
390: to get the ETIMEDOUT error back, though this is unlikely. The
391: backlog figure supplied with the listen call is currently limited
392: by the system to a maximum of 5 pending connections on any
393: one queue. This avoids the problem of processes hogging system
394: resources by setting an infinite backlog, then ignoring
395: all connection requests.
396: .PP
397: With a socket marked as listening, a server may \fIaccept\fP
398: a connection:
399: .DS
400: struct sockaddr_in from;
401: ...
402: fromlen = sizeof (from);
403: newsock = accept(s, (struct sockaddr *)&from, &fromlen);
404: .DE
405: (For the UNIX domain, \fIfrom\fP would be declared as a
406: \fIstruct sockaddr_un\fP, and for the NS domain, \fIfrom\fP
407: would be declared as a \fIstruct sockaddr_ns\fP,
408: but nothing different would need
409: to be done as far as \fIfromlen\fP is concerned. In the examples
410: which follow, only Internet routines will be discussed.) A new
411: descriptor is returned on receipt of a connection (along with
412: a new socket). If the server wishes to find out who its client is,
413: it may supply a buffer for the client socket's name. The value-result
414: parameter \fIfromlen\fP is initialized by the server to indicate how
415: much space is associated with \fIfrom\fP, then modified on return
416: to reflect the true size of the name. If the client's name is not
417: of interest, the second parameter may be a null pointer.
418: .PP
419: \fIAccept\fP normally blocks. That is, \fIaccept\fP
420: will not return until a connection is available or the system call
421: is interrupted by a signal to the process. Further, there is no
422: way for a process to indicate it will accept connections from only
423: a specific individual, or individuals. It is up to the user process
424: to consider who the connection is from and close down the connection
425: if it does not wish to speak to the process. If the server process
426: wants to accept connections on more than one socket, or wants to avoid blocking
427: on the accept call, there are alternatives; they will be considered
428: in section 5.
429: .NH 2
430: Data transfer
431: .PP
432: With a connection established, data may begin to flow. To send
433: and receive data there are a number of possible calls.
434: With the peer entity at each end of a connection
435: anchored, a user can send or receive a message without specifying
436: the peer. As one might expect, in this case, then
437: the normal \fIread\fP and \fIwrite\fP system calls are usable,
438: .DS
439: write(s, buf, sizeof (buf));
440: read(s, buf, sizeof (buf));
441: .DE
442: In addition to \fIread\fP and \fIwrite\fP,
443: the new calls \fIsend\fP and \fIrecv\fP
444: may be used:
445: .DS
446: send(s, buf, sizeof (buf), flags);
447: recv(s, buf, sizeof (buf), flags);
448: .DE
449: While \fIsend\fP and \fIrecv\fP are virtually identical to
450: \fIread\fP and \fIwrite\fP,
451: the extra \fIflags\fP argument is important. The flags,
452: defined in \fI<sys/socket.h>\fP, may be
453: specified as a non-zero value if one or more
454: of the following is required:
455: .DS
456: .TS
457: l l.
458: MSG_OOB send/receive out of band data
459: MSG_PEEK look at data without reading
460: MSG_DONTROUTE send data without routing packets
461: .TE
462: .DE
463: Out of band data is a notion specific to stream sockets, and one
464: which we will not immediately consider. The option to have data
465: sent without routing applied to the outgoing packets is currently
466: used only by the routing table management process, and is
467: unlikely to be of interest to the casual user. The ability
468: to preview data is, however, of interest. When MSG_PEEK
469: is specified with a \fIrecv\fP call, any data present is returned
470: to the user, but treated as still \*(lqunread\*(rq. That
471: is, the next \fIread\fP or \fIrecv\fP call applied to the socket will
472: return the data previously previewed.
473: .NH 2
474: Discarding sockets
475: .PP
476: Once a socket is no longer of interest, it may be discarded
477: by applying a \fIclose\fP to the descriptor,
478: .DS
479: close(s);
480: .DE
481: If data is associated with a socket which promises reliable delivery
482: (e.g. a stream socket) when a close takes place, the system will
483: continue to attempt to transfer the data.
484: However, after a fairly long period of
485: time, if the data is still undelivered, it will be discarded.
486: Should a user have no use for any pending data, it may
487: perform a \fIshutdown\fP on the socket prior to closing it.
488: This call is of the form:
489: .DS
490: shutdown(s, how);
491: .DE
492: where \fIhow\fP is 0 if the user is no longer interested in reading
493: data, 1 if no more data will be sent, or 2 if no data is to
494: be sent or received.
495: .NH 2
496: Connectionless sockets
497: .PP
498: To this point we have been concerned mostly with sockets which
499: follow a connection oriented model. However, there is also
500: support for connectionless interactions typical of the datagram
501: facilities found in contemporary packet switched networks.
502: A datagram socket provides a symmetric interface to data
503: exchange. While processes are still likely to be client
504: and server, there is no requirement for connection establishment.
505: Instead, each message includes the destination address.
506: .PP
507: Datagram sockets are created as before.
508: If a particular local address is needed,
509: the \fIbind\fP operation must precede the first data transmission.
510: Otherwise, the system will set the local address and/or port
511: when data is first sent.
512: To send data, the \fIsendto\fP primitive is used,
513: .DS
514: sendto(s, buf, buflen, flags, (struct sockaddr *)&to, tolen);
515: .DE
516: The \fIs\fP, \fIbuf\fP, \fIbuflen\fP, and \fIflags\fP
517: parameters are used as before.
518: The \fIto\fP and \fItolen\fP
519: values are used to indicate the address of the intended recipient of the
520: message. When
521: using an unreliable datagram interface, it is
522: unlikely that any errors will be reported to the sender. When
523: information is present locally to recognize a message that can
524: not be delivered (for instance when a network is unreachable),
525: the call will return \-1 and the global value \fIerrno\fP will
526: contain an error number.
527: .PP
528: To receive messages on an unconnected datagram socket, the
529: \fIrecvfrom\fP primitive is provided:
530: .DS
531: recvfrom(s, buf, buflen, flags, (struct sockaddr *)&from, &fromlen);
532: .DE
533: Once again, the \fIfromlen\fP parameter is handled in
534: a value-result fashion, initially containing the size of
535: the \fIfrom\fP buffer, and modified on return to indicate
536: the actual size of the address from which the datagram was received.
537: .PP
538: In addition to the two calls mentioned above, datagram
539: sockets may also use the \fIconnect\fP call to associate
540: a socket with a specific destination address. In this case, any
541: data sent on the socket will automatically be addressed
542: to the connected peer, and only data received from that
543: peer will be delivered to the user. Only one connected
544: address is permitted for each socket at one time;
545: a second connect will change the destination address,
546: and a connect to a null address (family AF_UNSPEC)
547: will disconnect.
548: Connect requests on datagram sockets return immediately,
549: as this simply results in the system recording
550: the peer's address (as compared to a stream socket, where a
551: connect request initiates establishment of an end to end
552: connection). \fIAccept\fP and \fIlisten\fP are not
553: used with datagram sockets.
554: .PP
555: While a datagram socket socket is connected,
556: errors from recent \fIsend\fP calls may be returned
557: asynchronously.
558: These errors may be reported on subsequent operations
559: on the socket,
560: or a special socket option used with \fIgetsockopt\fP, SO_ERROR,
561: may be used to interrogate the error status.
562: A \fIselect\fP for reading or writing will return true
563: when an error indication has been received.
564: The next operation will return the error, and the error status is cleared.
565: Other of the less
566: important details of datagram sockets are described
567: in section 5.
568: .NH 2
569: Input/Output multiplexing
570: .PP
571: One last facility often used in developing applications
572: is the ability to multiplex i/o requests among multiple
573: sockets and/or files. This is done using the \fIselect\fP
574: call:
575: .DS
576: #include <sys/time.h>
577: #include <sys/types.h>
578: ...
579:
580: fd_set readmask, writemask, exceptmask;
581: struct timeval timeout;
582: ...
583: select(nfds, &readmask, &writemask, &exceptmask, &timeout);
584: .DE
585: \fISelect\fP takes as arguments pointers to three sets, one for
586: the set of file descriptors for which the caller wishes to
587: be able to read data on, one for those descriptors to which
588: data is to be written, and one for which exceptional conditions
589: are pending; out-of-band data is the only
590: exceptional condition currently implemented by the socket
591: If the user is not interested
592: in certain conditions (i.e., read, write, or exceptions),
593: the corresponding argument to the \fIselect\fP should
594: be a null pointer.
595: .PP
596: Each set is actually a structure containing an array of
597: long integer bit masks; the size of the array is set
598: by the definition FD_SETSIZE.
599: The array is be
600: long enough to hold one bit for each of FD_SETSIZE file descriptors.
601: .PP
602: The macros FD_SET(\fIfd, &mask\fP) and
603: FD_CLR(\fIfd, &mask\fP)
604: have been provided for adding and removing file descriptor
605: \fIfd\fP in the set \fImask\fP. The
606: set should be zeroed before use, and
607: the macro FD_ZERO(\fI&mask\fP) has been provided
608: to clear the set \fImask\fP.
609: The parameter \fInfds\fP in the \fIselect\fP call specifies the range
610: of file descriptors (i.e. one plus the value of the largest
611: descriptor) to be examined in a set.
612: .PP
613: A timeout value may be specified if the selection
614: is not to last more than a predetermined period of time. If
615: the fields in \fItimeout\fP are set to 0, the selection takes
616: the form of a
617: \fIpoll\fP, returning immediately. If the last parameter is
618: a null pointer, the selection will block indefinitely*.
619: .FS
620: * To be more specific, a return takes place only when a
621: descriptor is selectable, or when a signal is received by
622: the caller, interrupting the system call.
623: .FE
624: \fISelect\fP normally returns the number of file descriptors selected;
625: if the \fIselect\fP call returns due to the timeout expiring, then
626: the value 0 is returned.
627: If the \fIselect\fP terminates because of an error or interruption,
628: a \-1 is returned with the error number in \fIerrno\fP,
629: and with the file descriptor masks unchanged.
630: .PP
631: Assuming a successful return, the three sets will
632: indicate which
633: file descriptors are ready to be read from, written to, or
634: have exceptional conditions pending.
635: The status of a file descriptor in a select mask may be
636: tested with the \fIFD_ISSET(fd, &mask)\fP macro, which
637: returns a non-zero value if \fIfd\fP is a member of the set
638: \fImask\fP, and 0 if it is not.
639: .PP
640: To determine if there are connections waiting
641: on a socket to be used with an \fIaccept\fP call,
642: \fIselect\fP can be used, followed by
643: a \fIFD_ISSET(fd, &mask)\fP macro to check for read
644: readiness on the appropriate socket. If \fIFD_ISSET\fP
645: returns a non-zero value, indicating permission to read, then a
646: connection is pending on the socket.
647: .PP
648: As an example, to read data from two sockets, \fIs1\fP and
649: \fIs2\fP as it is available from each and with a one-second
650: timeout, the following code
651: might be used:
652: .DS
653: #include <sys/time.h>
654: #include <sys/types.h>
655: ...
656: fd_set read_template;
657: struct timeval wait;
658: ...
659: for (;;) {
660: wait.tv_sec = 1; /* one second */
661: wait.tv_usec = 0;
662:
663: FD_ZERO(&read_template);
664:
665: FD_SET(s1, &read_template);
666: FD_SET(s2, &read_template);
667:
668: nb = select(FD_SETSIZE, &read_template, (fd_set *) 0, (fd_set *) 0, &wait);
669: if (nb <= 0) {
670: \fIAn error occurred during the \fPselect\fI, or
671: the \fPselect\fI timed out.\fP
672: }
673:
674: if (FD_ISSET(s1, &read_template)) {
675: \fISocket #1 is ready to be read from.\fP
676: }
677:
678: if (FD_ISSET(s2, &read_template)) {
679: \fISocket #2 is ready to be read from.\fP
680: }
681: }
682: .DE
683: .PP
684: In 4.2, the arguments to \fIselect\fP were pointers to integers
685: instead of pointers to \fIfd_set\fPs. This type of call
686: will still work as long as the number of file descriptors
687: being examined is less than the number of bits in an
688: integer; however, the methods illustrated above should
689: be used in all current programs.
690: .PP
691: \fISelect\fP provides a synchronous multiplexing scheme.
692: Asynchronous notification of output completion, input availability,
693: and exceptional conditions is possible through use of the
694: SIGIO and SIGURG signals described in section 5.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.