Sync usage with man page.
[netbsd-mini2440.git] / share / doc / psd / 21.ipc / 5.t
blob6e95a719335023d43be0b73ac87489514d64bebd
1 .\"     $NetBSD: 5.t,v 1.3 2003/02/05 00:02:27 perry Exp $
2 .\"
3 .\" Copyright (c) 1986, 1993
4 .\"     The Regents of the University of California.  All rights reserved.
5 .\"
6 .\" Redistribution and use in source and binary forms, with or without
7 .\" modification, are permitted provided that the following conditions
8 .\" are met:
9 .\" 1. Redistributions of source code must retain the above copyright
10 .\"    notice, this list of conditions and the following disclaimer.
11 .\" 2. Redistributions in binary form must reproduce the above copyright
12 .\"    notice, this list of conditions and the following disclaimer in the
13 .\"    documentation and/or other materials provided with the distribution.
14 .\" 3. Neither the name of the University nor the names of its contributors
15 .\"    may be used to endorse or promote products derived from this software
16 .\"    without specific prior written permission.
17 .\"
18 .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
19 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 .\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
22 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 .\" SUCH DAMAGE.
29 .\"
30 .\"     @(#)5.t 8.2 (Berkeley) 6/1/94
31 .\"
32 .\".ds RH "Advanced Topics
33 .nr H1 5
34 .nr H2 0
35 .LG
36 .sp 2
38 .ce
39 5. ADVANCED TOPICS
40 .sp 2
42 .NL
43 .PP
44 A number of facilities have yet to be discussed.  For most users
45 of the IPC the mechanisms already
46 described will suffice in constructing distributed
47 applications.  However, others will find the need to use some
48 of the features which we consider in this section.
49 .NH 2
50 Out of band data
51 .PP
52 The stream socket abstraction includes the notion of \*(lqout
53 of band\*(rq data.  Out of band data is a logically independent 
54 transmission channel associated with each pair of connected
55 stream sockets.  Out of band data is delivered to the user
56 independently of normal data.
57 The abstraction defines that the out of band data facilities
58 must support the reliable delivery of at least one
59 out of band message at a time.  This message may contain at least one
60 byte of data, and at least one message may be pending delivery
61 to the user at any one time.  For communications protocols which
62 support only in-band signaling (i.e. the urgent data is
63 delivered in sequence with the normal data), the system normally extracts
64 the data from the normal data stream and stores it separately.
65 This allows users to choose between receiving the urgent data
66 in order and receiving it out of sequence without having to
67 buffer all the intervening data.  It is possible
68 to ``peek'' (via MSG_PEEK) at out of band data.
69 If the socket has a process group, a SIGURG signal is generated
70 when the protocol is notified of its existence.
71 A process can set the process group
72 or process id to be informed by the SIGURG signal via the
73 appropriate \fIfcntl\fP call, as described below for
74 SIGIO.
75 If multiple sockets may have out of band data awaiting
76 delivery, a \fIselect\fP call for exceptional conditions
77 may be used to determine those sockets with such data pending.
78 Neither the signal nor the select indicate the actual arrival
79 of the out-of-band data, but only notification that it is pending.
80 .PP
81 In addition to the information passed, a logical mark is placed in
82 the data stream to indicate the point at which the out
83 of band data was sent.  The remote login and remote shell
84 applications use this facility to propagate signals between
85 client and server processes.  When a signal
86 flushs any pending output from the remote process(es), all
87 data up to the mark in the data stream is discarded.
88 .PP
89 To send an out of band message the MSG_OOB flag is supplied to
90 a \fIsend\fP or \fIsendto\fP calls,
91 while to receive out of band data MSG_OOB should be indicated
92 when performing a \fIrecvfrom\fP or \fIrecv\fP call.
93 To find out if the read pointer is currently pointing at
94 the mark in the data stream, the SIOCATMARK ioctl is provided:
95 .DS
96 ioctl(s, SIOCATMARK, &yes);
97 .DE
98 If \fIyes\fP is a 1 on return, the next read will return data
99 after the mark.  Otherwise (assuming out of band data has arrived), 
100 the next read will provide data sent by the client prior
101 to transmission of the out of band signal.  The routine used
102 in the remote login process to flush output on receipt of an
103 interrupt or quit signal is shown in Figure 5.
104 It reads the normal data up to the mark (to discard it),
105 then reads the out-of-band byte.
108 #include <sys/ioctl.h>
109 #include <sys/file.h>
110  ...
111 oob()
113         int out = FWRITE, mark;
114         char waste[BUFSIZ];
116         /* flush local terminal output */
117         ioctl(1, TIOCFLUSH, (char *)&out);
118         for (;;) {
119                 if (ioctl(rem, SIOCATMARK, &mark) < 0) {
120                         perror("ioctl");
121                         break;
122                 }
123                 if (mark)
124                         break;
125                 (void) read(rem, waste, sizeof (waste));
126         }
127         if (recv(rem, &mark, 1, MSG_OOB) < 0) {
128                 perror("recv");
129                 ...
130         }
131         ...
135 Figure 5.  Flushing terminal I/O on receipt of out of band data.
139 A process may also read or peek at the out-of-band data
140 without first reading up to the mark.
141 This is more difficult when the underlying protocol delivers
142 the urgent data in-band with the normal data, and only sends
143 notification of its presence ahead of time (e.g., the TCP protocol
144 used to implement streams in the Internet domain).
145 With such protocols, the out-of-band byte may not yet have arrived
146 when a \fIrecv\fP is done with the MSG_OOB flag.
147 In that case, the call will return an error of EWOULDBLOCK.
148 Worse, there may be enough in-band data in the input buffer
149 that normal flow control prevents the peer from sending the urgent data
150 until the buffer is cleared.
151 The process must then read enough of the queued data
152 that the urgent data may be delivered.
154 Certain programs that use multiple bytes of urgent data and must
155 handle multiple urgent signals (e.g., \fItelnet\fP\|(1C))
156 need to retain the position of urgent data within the stream.
157 This treatment is available as a socket-level option, SO_OOBINLINE;
158 see \fIsetsockopt\fP\|(2) for usage.
159 With this option, the position of urgent data (the \*(lqmark\*(rq)
160 is retained, but the urgent data immediately follows the mark
161 within the normal data stream returned without the MSG_OOB flag.
162 Reception of multiple urgent indications causes the mark to move,
163 but no out-of-band data are lost.
164 .NH 2
165 Non-Blocking Sockets
167 It is occasionally convenient to make use of sockets
168 which do not block; that is, I/O requests which
169 cannot complete immediately and
170 would therefore cause the process to be suspended awaiting completion are
171 not executed, and an error code is returned.
172 Once a socket has been created via
173 the \fIsocket\fP call, it may be marked as non-blocking
174 by \fIfcntl\fP as follows:
176 #include <fcntl.h>
177  ...
178 int     s;
179  ...
180 s = socket(AF_INET, SOCK_STREAM, 0);
181  ...
182 if (fcntl(s, F_SETFL, FNDELAY) < 0)
183         perror("fcntl F_SETFL, FNDELAY");
184         exit(1);
186  ...
189 When performing non-blocking I/O on sockets, one must be
190 careful to check for the error EWOULDBLOCK (stored in the
191 global variable \fIerrno\fP), which occurs when
192 an operation would normally block, but the socket it
193 was performed on is marked as non-blocking.
194 In particular, \fIaccept\fP, \fIconnect\fP, \fIsend\fP, \fIrecv\fP,
195 \fIread\fP, and \fIwrite\fP can
196 all return EWOULDBLOCK, and processes should be prepared
197 to deal with such return codes.
198 If an operation such as a \fIsend\fP cannot be done in its entirety,
199 but partial writes are sensible (for example, when using a stream socket),
200 the data that can be sent immediately will be processed,
201 and the return value will indicate the amount actually sent.
202 .NH 2
203 Interrupt driven socket I/O
205 The SIGIO signal allows a process to be notified
206 via a signal when a socket (or more generally, a file
207 descriptor) has data waiting to be read.  Use of
208 the SIGIO facility requires three steps:  First,
209 the process must set up a SIGIO signal handler
210 by use of the \fIsignal\fP or \fIsigvec\fP calls.  Second,
211 it must set the process id or process group id which is to receive
212 notification of pending input to its own process id,
213 or the process group id of its process group (note that
214 the default process group of a socket is group zero).
215 This is accomplished by use of an \fIfcntl\fP call.
216 Third, it must enable asynchronous notification of pending I/O requests
217 with another \fIfcntl\fP call.  Sample code to
218 allow a given process to receive information on
219 pending I/O requests as they occur for a socket \fIs\fP
220 is given in Figure 6.  With the addition of a handler for SIGURG,
221 this code can also be used to prepare for receipt of SIGURG signals.
224 #include <fcntl.h>
225  ...
226 int     io_handler();
227  ...
228 signal(SIGIO, io_handler);
230 /* Set the process receiving SIGIO/SIGURG signals to us */
232 if (fcntl(s, F_SETOWN, getpid()) < 0) {
233         perror("fcntl F_SETOWN");
234         exit(1);
237 /* Allow receipt of asynchronous I/O signals */
239 if (fcntl(s, F_SETFL, FASYNC) < 0) {
240         perror("fcntl F_SETFL, FASYNC");
241         exit(1);
245 Figure 6.  Use of asynchronous notification of I/O requests.
248 .NH 2
249 Signals and process groups
251 Due to the existence of the SIGURG and SIGIO signals each socket has an
252 associated process number, just as is done for terminals.
253 This value is initialized to zero,
254 but may be redefined at a later time with the F_SETOWN
255 \fIfcntl\fP, such as was done in the code above for SIGIO.
256 To set the socket's process id for signals, positive arguments
257 should be given to the \fIfcntl\fP call.  To set the socket's
258 process group for signals, negative arguments should be 
259 passed to \fIfcntl\fP.  Note that the process number indicates
260 either the associated process id or the associated process
261 group; it is impossible to specify both at the same time.
262 A similar \fIfcntl\fP, F_GETOWN, is available for determining the
263 current process number of a socket.
265 Another signal which is useful when constructing server processes
266 is SIGCHLD.  This signal is delivered to a process when any
267 child processes have changed state.  Normally servers use
268 the signal to \*(lqreap\*(rq child processes that have exited
269 without explicitly awaiting their termination
270 or periodic polling for exit status.
271 For example, the remote login server loop shown in Figure 2
272 may be augmented as shown in Figure 7.
275 int reaper();
276  ...
277 signal(SIGCHLD, reaper);
278 listen(f, 5);
279 for (;;) {
280         int g, len = sizeof (from);
282         g = accept(f, (struct sockaddr *)&from, &len,);
283         if (g < 0) {
284                 if (errno != EINTR)
285                         syslog(LOG_ERR, "rlogind: accept: %m");
286                 continue;
287         }
288         ...
290  ...
291 #include <wait.h>
292 reaper()
294         union wait status;
296         while (wait3(&status, WNOHANG, 0) > 0)
297                 ;
302 Figure 7.  Use of the SIGCHLD signal.
306 If the parent server process fails to reap its children,
307 a large number of \*(lqzombie\*(rq processes may be created.
308 .NH 2
309 Pseudo terminals
311 Many programs will not function properly without a terminal
312 for standard input and output.  Since sockets do not provide
313 the semantics of terminals,
314 it is often necessary to have a process communicating over
315 the network do so through a \fIpseudo-terminal\fP.  A pseudo-
316 terminal is actually a pair of devices, master and slave,
317 which allow a process to serve as an active agent in communication
318 between processes and users.  Data written on the slave side
319 of a pseudo-terminal is supplied as input to a process reading
320 from the master side, while data written on the master side are
321 processed as terminal input for the slave.
322 In this way, the process manipulating
323 the master side of the pseudo-terminal has control over the
324 information read and written on the slave side
325 as if it were manipulating the keyboard and reading the screen
326 on a real terminal.
327 The purpose of this abstraction is to
328 preserve terminal semantics over a network connection\(em
329 that is, the slave side appears as a normal terminal to
330 any process reading from or writing to it.
332 For example, the remote
333 login server uses pseudo-terminals for remote login sessions.
334 A user logging in to a machine across the network is provided
335 a shell with a slave pseudo-terminal as standard input, output,
336 and error.  The server process then handles the communication
337 between the programs invoked by the remote shell and the user's
338 local client process.
339 When a user sends a character that generates an interrupt
340 on the remote machine that flushes terminal output,
341 the pseudo-terminal generates a control message for the server process.
342 The server then sends an out of band message
343 to the client process to signal a flush of data at the real terminal
344 and on the intervening data buffered in the network.
346 Under 4.4BSD, the name of the slave side of a pseudo-terminal is of the form
347 \fI/dev/ttyxy\fP, where \fIx\fP is a single letter
348 starting at `p' and continuing to `t'.
349 \fIy\fP is a hexadecimal digit (i.e., a single
350 character in the range 0 through 9 or `a' through `f').
351 The master side of a pseudo-terminal is \fI/dev/ptyxy\fP,
352 where \fIx\fP and \fIy\fP correspond to the
353 slave side of the pseudo-terminal.
355 In general, the method of obtaining a pair of master and
356 slave pseudo-terminals is to
357 find a pseudo-terminal which
358 is not currently in use.
359 The master half of a pseudo-terminal is a single-open device;
360 thus, each master may be opened in turn until an open succeeds.
361 The slave side of the pseudo-terminal is then opened,
362 and is set to the proper terminal modes if necessary.
363 The process then \fIfork\fPs; the child closes
364 the master side of the pseudo-terminal, and \fIexec\fPs the
365 appropriate program.  Meanwhile, the parent closes the
366 slave side of the pseudo-terminal and begins reading and
367 writing from the master side.  Sample code making use of
368 pseudo-terminals is given in Figure 8; this code assumes
369 that a connection on a socket \fIs\fP exists, connected
370 to a peer who wants a service of some kind, and that the
371 process has disassociated itself from any previous controlling terminal.
372 .NH 2
373 Selecting specific protocols
375 If the third argument to the \fIsocket\fP call is 0,
376 \fIsocket\fP will select a default protocol to use with
377 the returned socket of the type requested.
378 The default protocol is usually correct, and alternate choices are not
379 usually available.
380 However, when using ``raw'' sockets to communicate directly with
381 lower-level protocols or hardware interfaces,
382 the protocol argument may be important for setting up demultiplexing.
383 For example, raw sockets in the Internet family may be used to implement
384 a new protocol above IP, and the socket will receive packets
385 only for the protocol specified.
386 To obtain a particular protocol one determines the protocol number
387 as defined within the communication domain.  For the Internet
388 domain one may use one of the library routines
389 discussed in section 3, such as \fIgetprotobyname\fP:
391 #include <sys/types.h>
392 #include <sys/socket.h>
393 #include <netinet/in.h>
394 #include <netdb.h>
395  ...
396 pp = getprotobyname("newtcp");
397 s = socket(AF_INET, SOCK_STREAM, pp->p_proto);
399 This would result in a socket \fIs\fP using a stream
400 based connection, but with protocol type of ``newtcp''
401 instead of the default ``tcp.''
403 In the NS domain, the available socket protocols are defined in
404 <\fInetns/ns.h\fP>.  To create a raw socket for Xerox Error Protocol
405 messages, one might use:
407 #include <sys/types.h>
408 #include <sys/socket.h>
409 #include <netns/ns.h>
410  ...
411 s = socket(AF_NS, SOCK_RAW, NSPROTO_ERROR);
413 .ne 1i
415 gotpty = 0;
416 for (c = 'p'; !gotpty && c <= 's'; c++) {
417         line = "/dev/ptyXX";
418         line[sizeof("/dev/pty")-1] = c;
419         line[sizeof("/dev/ptyp")-1] = '0';
420         if (stat(line, &statbuf) < 0)
421                 break;
422         for (i = 0; i < 16; i++) {
423                 line[sizeof("/dev/ptyp")-1] = "0123456789abcdef"[i];
424                 master = open(line, O_RDWR);
425                 if (master > 0) {
426                         gotpty = 1;
427                         break;
428                 }
429         }
431 if (!gotpty) {
432         syslog(LOG_ERR, "All network ports in use");
433         exit(1);
436 line[sizeof("/dev/")-1] = 't';
437 slave = open(line, O_RDWR);     /* \fIslave\fP is now slave side */
438 if (slave < 0) {
439         syslog(LOG_ERR, "Cannot open slave pty %s", line);
440         exit(1);
443 ioctl(slave, TIOCGETP, &b);     /* Set slave tty modes */
444 b.sg_flags = CRMOD|XTABS|ANYP;
445 ioctl(slave, TIOCSETP, &b);
447 i = fork();
448 if (i < 0) {
449         syslog(LOG_ERR, "fork: %m");
450         exit(1);
451 } else if (i) {         /* Parent */
452         close(slave);
453         ...
454 } else {                 /* Child */
455         (void) close(s);
456         (void) close(master);
457         dup2(slave, 0);
458         dup2(slave, 1);
459         dup2(slave, 2);
460         if (slave > 2)
461                 (void) close(slave);
462         ...
466 Figure 8.  Creation and use of a pseudo terminal
468 .ne 1i
469 .NH 2
470 Address binding
472 As was mentioned in section 2, 
473 binding addresses to sockets in the Internet and NS domains can be
474 fairly complex.  As a brief reminder, these associations
475 are composed of local and foreign
476 addresses, and local and foreign ports.  Port numbers are
477 allocated out of separate spaces, one for each system and one
478 for each domain on that system.
479 Through the \fIbind\fP system call, a
480 process may specify half of an association, the
481 <local address, local port> part, while the
482 \fIconnect\fP
483 and \fIaccept\fP
484 primitives are used to complete a socket's association by
485 specifying the <foreign address, foreign port> part.
486 Since the association is created in two steps the association
487 uniqueness requirement indicated previously could be violated unless
488 care is taken.  Further, it is unrealistic to expect user
489 programs to always know proper values to use for the local address
490 and local port since a host may reside on multiple networks and
491 the set of allocated port numbers is not directly accessible
492 to a user.
494 To simplify local address binding in the Internet domain the notion of a
495 \*(lqwildcard\*(rq address has been provided.  When an address
496 is specified as INADDR_ANY (a manifest constant defined in
497 <netinet/in.h>), the system interprets the address as 
498 \*(lqany valid address\*(rq.  For example, to bind a specific
499 port number to a socket, but leave the local address unspecified,
500 the following code might be used:
502 #include <sys/types.h>
503 #include <netinet/in.h>
504  ...
505 struct sockaddr_in sin;
506  ...
507 s = socket(AF_INET, SOCK_STREAM, 0);
508 sin.sin_family = AF_INET;
509 sin.sin_addr.s_addr = htonl(INADDR_ANY);
510 sin.sin_port = htons(MYPORT);
511 bind(s, (struct sockaddr *) &sin, sizeof (sin));
513 Sockets with wildcarded local addresses may receive messages
514 directed to the specified port number, and sent to any
515 of the possible addresses assigned to a host.  For example,
516 if a host has addresses 128.32.0.4 and 10.0.0.78, and a socket is bound as
517 above, the process will be
518 able to accept connection requests which are addressed to
519 128.32.0.4 or 10.0.0.78.
520 If a server process wished to only allow hosts on a
521 given network connect to it, it would bind
522 the address of the host on the appropriate network.
524 In a similar fashion, a local port may be left unspecified
525 (specified as zero), in which case the system will select an
526 appropriate port number for it.  This shortcut will work
527 both in the Internet and NS domains.  For example, to
528 bind a specific local address to a socket, but to leave the
529 local port number unspecified:
531 hp = gethostbyname(hostname);
532 if (hp == NULL) {
533         ...
535 bcopy(hp->h_addr, (char *) sin.sin_addr, hp->h_length);
536 sin.sin_port = htons(0);
537 bind(s, (struct sockaddr *) &sin, sizeof (sin));
539 The system selects the local port number based on two criteria.
540 The first is that on 4BSD systems,
541 Internet ports below IPPORT_RESERVED (1024) (for the Xerox domain,
542 0 through 3000) are reserved
543 for privileged users (i.e., the super user);
544 Internet ports above IPPORT_USERRESERVED (50000) are reserved
545 for non-privileged servers.  The second is
546 that the port number is not currently bound to some other
547 socket.  In order to find a free Internet port number in the privileged
548 range the \fIrresvport\fP library routine may be used as follows
549 to return a stream socket in with a privileged port number:
551 int lport = IPPORT_RESERVED \- 1;
552 int s;
553 \&...
554 s = rresvport(&lport);
555 if (s < 0) {
556         if (errno == EAGAIN)
557                 fprintf(stderr, "socket: all ports in use\en");
558         else
559                 perror("rresvport: socket");
560         ...
563 The restriction on allocating ports was done to allow processes
564 executing in a \*(lqsecure\*(rq environment to perform authentication
565 based on the originating address and port number.  For example,
566 the \fIrlogin\fP(1) command allows users to log in across a network
567 without being asked for a password, if two conditions hold:
568 First, the name of the system the user
569 is logging in from is in the file
570 \fI/etc/hosts.equiv\fP on the system he is logging
571 in to (or the system name and the user name are in
572 the user's \fI.rhosts\fP file in the user's home
573 directory), and second, that the user's rlogin
574 process is coming from a privileged port on the machine from which he is
575 logging.  The port number and network address of the
576 machine from which the user is logging in can be determined either
577 by the \fIfrom\fP result of the \fIaccept\fP call, or
578 from the \fIgetpeername\fP call.
580 In certain cases the algorithm used by the system in selecting
581 port numbers is unsuitable for an application.  This is because
582 associations are created in a two step process.  For example,
583 the Internet file transfer protocol, FTP, specifies that data
584 connections must always originate from the same local port.  However,
585 duplicate associations are avoided by connecting to different foreign
586 ports.  In this situation the system would disallow binding the
587 same local address and port number to a socket if a previous data
588 connection's socket still existed.  To override the default port
589 selection algorithm, an option call must be performed prior
590 to address binding:
592  ...
593 int     on = 1;
594  ...
595 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
596 bind(s, (struct sockaddr *) &sin, sizeof (sin));
598 With the above call, local addresses may be bound which
599 are already in use.  This does not violate the uniqueness
600 requirement as the system still checks at connect time to
601 be sure any other sockets with the same local address and
602 port do not have the same foreign address and port.
603 If the association already exists, the error EADDRINUSE is returned.
604 A related socket option, SO_REUSEPORT, which allows completely 
605 duplicate bindings, is described in the IP multicasting section.
606 .NH 2
607 Socket Options
609 It is possible to set and get a number of options on sockets
610 via the \fIsetsockopt\fP and \fIgetsockopt\fP system calls.
611 These options include such things as marking a socket for
612 broadcasting, not to route, to linger on close, etc.
613 In addition, there are protocol-specific options for IP and TCP,
614 as described in
615 .IR ip (4),
616 .IR tcp (4),
617 and in the section on multicasting below.
619 The general forms of the calls are:
621 setsockopt(s, level, optname, optval, optlen);
625 getsockopt(s, level, optname, optval, optlen);
628 The parameters to the calls are as follows: \fIs\fP
629 is the socket on which the option is to be applied.
630 \fILevel\fP specifies the protocol layer on which the
631 option is to be applied; in most cases this is
632 the ``socket level'', indicated by the symbolic constant
633 SOL_SOCKET, defined in \fI<sys/socket.h>.\fP
634 The actual option is specified in \fIoptname\fP, and is
635 a symbolic constant also defined in \fI<sys/socket.h>\fP.
636 \fIOptval\fP and \fIOptlen\fP point to the value of the
637 option (in most cases, whether the option is to be turned
638 on or off), and the length of the value of the option,
639 respectively.
640 For \fIgetsockopt\fP, \fIoptlen\fP is
641 a value-result parameter, initially set to the size of
642 the storage area pointed to by \fIoptval\fP, and modified
643 upon return to indicate the actual amount of storage used.
645 An example should help clarify things.  It is sometimes
646 useful to determine the type (e.g., stream, datagram, etc.)
647 of an existing socket; programs
648 under \fIinetd\fP (described below) may need to perform this
649 task.  This can be accomplished as follows via the
650 SO_TYPE socket option and the \fIgetsockopt\fP call:
652 #include <sys/types.h>
653 #include <sys/socket.h>
655 int type, size;
657 size = sizeof (int);
659 if (getsockopt(s, SOL_SOCKET, SO_TYPE, (char *) &type, &size) < 0) {
660         ...
663 After the \fIgetsockopt\fP call, \fItype\fP will be set
664 to the value of the socket type, as defined in
665 \fI<sys/socket.h>\fP.  If, for example, the socket were
666 a datagram socket, \fItype\fP would have the value
667 corresponding to SOCK_DGRAM.
668 .NH 2
669 Broadcasting and determining network configuration
671 By using a datagram socket, it is possible to send broadcast
672 packets on many networks supported by the system.
673 The network itself must support broadcast; the system
674 provides no simulation of broadcast in software.
675 Broadcast messages can place a high load on a network since they force
676 every host on the network to service them.  Consequently,
677 the ability to send broadcast packets has been limited
678 to sockets which are explicitly marked as allowing broadcasting.
679 Broadcast is typically used for one of two reasons:
680 it is desired to find a resource on a local network without prior
681 knowledge of its address,
682 or important functions such as routing require that information
683 be sent to all accessible neighbors.
685 Multicasting is an alternative to broadcasting.
686 Setting up IP multicast sockets is described in the next section.
688 To send a broadcast message, a datagram socket 
689 should be created:
691 s = socket(AF_INET, SOCK_DGRAM, 0);
695 s = socket(AF_NS, SOCK_DGRAM, 0);
697 The socket is marked as allowing broadcasting,
699 int     on = 1;
701 setsockopt(s, SOL_SOCKET, SO_BROADCAST, &on, sizeof (on));
703 and at least a port number should be bound to the socket:
705 sin.sin_family = AF_INET;
706 sin.sin_addr.s_addr = htonl(INADDR_ANY);
707 sin.sin_port = htons(MYPORT);
708 bind(s, (struct sockaddr *) &sin, sizeof (sin));
710 .ne 1i
711 or, for the NS domain,
713 sns.sns_family = AF_NS;
714 netnum = htonl(net);
715 sns.sns_addr.x_net = *(union ns_net *) &netnum; /* insert net number */
716 sns.sns_addr.x_port = htons(MYPORT);
717 bind(s, (struct sockaddr *) &sns, sizeof (sns));
719 The destination address of the message to be broadcast
720 depends on the network(s) on which the message is to be broadcast.
721 The Internet domain supports a shorthand notation for broadcast
722 on the local network, the address INADDR_BROADCAST (defined in
723 <\fInetinet/in.h\fP>.
724 To determine the list of addresses for all reachable neighbors
725 requires knowledge of the networks to which the host is connected.
726 Since this information should
727 be obtained in a host-independent fashion and may be impossible
728 to derive, 4.4BSD provides a method of
729 retrieving this information from the system data structures.
730 The SIOCGIFCONF \fIioctl\fP call returns the interface
731 configuration of a host in the form of a
732 single \fIifconf\fP structure; this structure contains
733 a ``data area'' which is made up of an array of
734 of \fIifreq\fP structures, one for each network interface
735 to which the host is connected.
736 These structures are defined in
737 \fI<net/if.h>\fP as follows:
739 .if t .ta .5i 1.0i 1.5i 3.5i
740 .if n .ta .7i 1.4i 2.1i 3.4i
741 struct ifconf {
742         int     ifc_len;                /* size of associated buffer */
743         union {
744                 caddr_t ifcu_buf;
745                 struct  ifreq *ifcu_req;
746         } ifc_ifcu;
749 #define ifc_buf ifc_ifcu.ifcu_buf               /* buffer address */
750 #define ifc_req ifc_ifcu.ifcu_req               /* array of structures returned */
752 #define IFNAMSIZ        16
754 struct ifreq {
755         char    ifr_name[IFNAMSIZ];             /* if name, e.g. "en0" */
756         union {
757                 struct  sockaddr ifru_addr;
758                 struct  sockaddr ifru_dstaddr;
759                 struct  sockaddr ifru_broadaddr;
760                 short   ifru_flags;
761                 caddr_t ifru_data;
762         } ifr_ifru;
765 .if t .ta \w'  #define'u +\w'  ifr_broadaddr'u +\w'  ifr_ifru.ifru_broadaddr'u
766 #define ifr_addr        ifr_ifru.ifru_addr      /* address */
767 #define ifr_dstaddr     ifr_ifru.ifru_dstaddr   /* other end of p-to-p link */
768 #define ifr_broadaddr   ifr_ifru.ifru_broadaddr /* broadcast address */
769 #define ifr_flags       ifr_ifru.ifru_flags     /* flags */
770 #define ifr_data        ifr_ifru.ifru_data      /* for use by interface */
772 The actual call which obtains the
773 interface configuration is
775 struct ifconf ifc;
776 char buf[BUFSIZ];
778 ifc.ifc_len = sizeof (buf);
779 ifc.ifc_buf = buf;
780 if (ioctl(s, SIOCGIFCONF, (char *) &ifc) < 0) {
781         ...
784 After this call \fIbuf\fP will contain one \fIifreq\fP structure for
785 each network to which the host is connected, and
786 \fIifc.ifc_len\fP will have been modified to reflect the number
787 of bytes used by the \fIifreq\fP structures.
789 For each structure
790 there exists a set of ``interface flags'' which tell
791 whether the network corresponding to that interface is
792 up or down, point to point or broadcast, etc.  The
793 SIOCGIFFLAGS \fIioctl\fP retrieves these
794 flags for an interface specified by an \fIifreq\fP
795 structure as follows:
797 struct ifreq *ifr;
799 ifr = ifc.ifc_req;
801 for (n = ifc.ifc_len / sizeof (struct ifreq); --n >= 0; ifr++) {
802         /*
803          * We must be careful that we don't use an interface
804          * devoted to an address family other than those intended;
805          * if we were interested in NS interfaces, the
806          * AF_INET would be AF_NS.
807          */
808         if (ifr->ifr_addr.sa_family != AF_INET)
809                 continue;
810         if (ioctl(s, SIOCGIFFLAGS, (char *) ifr) < 0) {
811                 ...
812         }
813         /*
814          * Skip boring cases.
815          */
816         if ((ifr->ifr_flags & IFF_UP) == 0 ||
817             (ifr->ifr_flags & IFF_LOOPBACK) ||
818             (ifr->ifr_flags & (IFF_BROADCAST | IFF_POINTTOPOINT)) == 0)
819                 continue;
822 Once the flags have been obtained, the broadcast address 
823 must be obtained.  In the case of broadcast networks this is
824 done via the SIOCGIFBRDADDR \fIioctl\fP, while for point-to-point networks
825 the address of the destination host is obtained with SIOCGIFDSTADDR.
827 struct sockaddr dst;
829 if (ifr->ifr_flags & IFF_POINTTOPOINT) {
830         if (ioctl(s, SIOCGIFDSTADDR, (char *) ifr) < 0) {
831                 ...
832         }
833         bcopy((char *) ifr->ifr_dstaddr, (char *) &dst, sizeof (ifr->ifr_dstaddr));
834 } else if (ifr->ifr_flags & IFF_BROADCAST) {
835         if (ioctl(s, SIOCGIFBRDADDR, (char *) ifr) < 0) {
836                 ...
837         }
838         bcopy((char *) ifr->ifr_broadaddr, (char *) &dst, sizeof (ifr->ifr_broadaddr));
842 After the appropriate \fIioctl\fP's have obtained the broadcast
843 or destination address (now in \fIdst\fP), the \fIsendto\fP call may be
844 used:
846         sendto(s, buf, buflen, 0, (struct sockaddr *)&dst, sizeof (dst));
849 In the above loop one \fIsendto\fP occurs for every
850 interface to which the host is connected that supports the notion of
851 broadcast or point-to-point addressing.
852 If a process only wished to send broadcast
853 messages on a given network, code similar to that outlined above
854 would be used, but the loop would need to find the
855 correct destination address.
857 Received broadcast messages contain the senders address
858 and port, as datagram sockets are bound before
859 a message is allowed to go out.
860 .NH 2
861 IP Multicasting
863 IP multicasting is the transmission of an IP datagram to a "host
864 group", a set of zero or more hosts identified by a single IP
865 destination address.  A multicast datagram is delivered to all
866 members of its destination host group with the same "best-efforts"
867 reliability as regular unicast IP datagrams, i.e., the datagram is
868 not guaranteed to arrive intact at all members of the destination
869 group or in the same order relative to other datagrams.
871 The membership of a host group is dynamic; that is, hosts may join
872 and leave groups at any time.  There is no restriction on the
873 location or number of members in a host group.  A host may be a
874 member of more than one group at a time.  A host need not be a member
875 of a group to send datagrams to it.
877 A host group may be permanent or transient.  A permanent group has a
878 well-known, administratively assigned IP address.  It is the address,
879 not the membership of the group, that is permanent; at any time a
880 permanent group may have any number of members, even zero.  Those IP
881 multicast addresses that are not reserved for permanent groups are
882 available for dynamic assignment to transient groups which exist only
883 as long as they have members.
885 In general, a host cannot assume that datagrams sent to any host
886 group address will reach only the intended hosts, or that datagrams
887 received as a member of a transient host group are intended for the
888 recipient.  Misdelivery must be detected at a level above IP, using
889 higher-level identifiers or authentication tokens.  Information
890 transmitted to a host group address should be encrypted or governed
891 by administrative routing controls if the sender is concerned about
892 unwanted listeners.
894 IP multicasting is currently supported only on AF_INET sockets of type
895 SOCK_DGRAM and SOCK_RAW, and only on subnetworks for which the interface
896 driver has been modified to support multicasting.
898 The next subsections describe how to send and receive multicast datagrams.
899 .NH 3 
900 Sending IP Multicast Datagrams
902 To send a multicast datagram, specify an IP multicast address in the range
903 224.0.0.0 to 239.255.255.255 as the destination address
904 in a
905 .IR sendto (2)
906 call.
908 The definitions required for the multicast-related socket options are
909 found in \fI<netinet/in.h>\fP.
910 All IP addresses are passed in network byte-order.
912 By default, IP multicast datagrams are sent with a time-to-live (TTL) of 1,
913 which prevents them from being forwarded beyond a single subnetwork.  A new
914 socket option allows the TTL for subsequent multicast datagrams to be set to
915 any value from 0 to 255, in order to control the scope of the multicasts:
917 u_char ttl;
918 setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl));
920 Multicast datagrams with a TTL of 0 will not be transmitted on any subnet,
921 but may be delivered locally if the sending host belongs to the destination
922 group and if multicast loopback has not been disabled on the sending socket
923 (see below).  Multicast datagrams with TTL greater than one may be delivered
924 to more than one subnet if there are one or more multicast routers attached
925 to the first-hop subnet.  To provide meaningful scope control, the multicast
926 routers support the notion of TTL "thresholds", which prevent datagrams with
927 less than a certain TTL from traversing certain subnets.  The thresholds
928 enforce the following convention:
930 center;
931 l | l
932 l | n.
934 Scope   Initial TTL
936 restricted to the same host     0
937 restricted to the same subnet   1
938 restricted to the same site     32
939 restricted to the same region   64
940 restricted to the same continent        128
941 unrestricted    255
944 "Sites" and "regions" are not strictly defined, and sites may be further
945 subdivided into smaller administrative units, as a local matter.
947 An application may choose an initial TTL other than the ones listed above.
948 For example, an application might perform an "expanding-ring search" for a
949 network resource by sending a multicast query, first with a TTL of 0, and
950 then with larger and larger TTLs, until a reply is received, perhaps using
951 the TTL sequence 0, 1, 2, 4, 8, 16, 32.
953 The multicast router
954 .IR mrouted (8),
955 refuses to forward any
956 multicast datagram with a destination address between 224.0.0.0 and
957 224.0.0.255, inclusive, regardless of its TTL.  This range of addresses is
958 reserved for the use of routing protocols and other low-level topology
959 discovery or maintenance protocols, such as gateway discovery and group
960 membership reporting.
962 The address 224.0.0.0 is
963 guaranteed not to be assigned to any group, and 224.0.0.1 is assigned
964 to the permanent group of all IP hosts (including gateways).  This is
965 used to address all multicast hosts on the directly connected
966 network.  There is no multicast address (or any other IP address) for
967 all hosts on the total Internet.  The addresses of other well-known,
968 permanent groups are published in the "Assigned Numbers" RFC,
969 which is available from the InterNIC.
971 Each multicast transmission is sent from a single network interface, even if
972 the host has more than one multicast-capable interface.  (If the host is
973 also serving as a multicast router,
974 a multicast may be \fIforwarded\fP to interfaces
975 other than originating interface, provided that the TTL is greater than 1.)
976 The default interface to be used for multicasting is the primary network
977 interface on the system.
978 A socket option
979 is available to override the default for subsequent transmissions from a
980 given socket:
982 struct in_addr addr;
983 setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, &addr, sizeof(addr));
985 where "addr" is the local IP address of the desired outgoing interface.
986 An address of INADDR_ANY may be used to revert to the default interface.
987 The local IP address of an interface can be obtained via the SIOCGIFCONF
988 ioctl.  To determine if an interface supports multicasting, fetch the
989 interface flags via the SIOCGIFFLAGS ioctl and see if the IFF_MULTICAST
990 flag is set.  (Normal applications should not need to use this option; it
991 is intended primarily for multicast routers and other system services
992 specifically concerned with internet topology.)
993 The SIOCGIFCONF and SIOCGIFFLAGS ioctls are described in the previous section.
995 If a multicast datagram is sent to a group to which the sending host itself
996 belongs (on the outgoing interface), a copy of the datagram is, by default,
997 looped back by the IP layer for local delivery.  Another socket option gives
998 the sender explicit control over whether or not subsequent datagrams are
999 looped back:
1001 u_char loop;
1002 setsockopt(sock, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop));
1004 where \f2loop\f1 is set to 0 to disable loopback,
1005 and set to 1 to enable loopback.
1006 This option
1007 improves performance for applications that may have no more than one
1008 instance on a single host (such as a router demon), by eliminating
1009 the overhead of receiving their own transmissions.  It should generally not
1010 be used by applications for which there may be more than one instance on a
1011 single host (such as a conferencing program) or for which the sender does
1012 not belong to the destination group (such as a time querying program).
1014 A multicast datagram sent with an initial TTL greater than 1 may be delivered
1015 to the sending host on a different interface from that on which it was sent,
1016 if the host belongs to the destination group on that other interface.  The
1017 loopback control option has no effect on such delivery.
1018 .NH 3 
1019 Receiving IP Multicast Datagrams
1021 Before a host can receive IP multicast datagrams, it must become a member
1022 of one or more IP multicast groups.  A process can ask the host to join
1023 a multicast group by using the following socket option:
1025 struct ip_mreq mreq;
1026 setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq))
1028 where "mreq" is the following structure:
1030 struct ip_mreq {
1031     struct in_addr imr_multiaddr; /* \fImulticast group to join\fP */
1032     struct in_addr imr_interface; /* \fIinterface to join on\fP */
1035 Every membership is associated with a single interface, and it is possible
1036 to join the same group on more than one interface.  "imr_interface" should
1037 be INADDR_ANY to choose the default multicast interface, or one of the
1038 host's local addresses to choose a particular (multicast-capable) interface.
1039 Up to IP_MAX_MEMBERSHIPS (currently 20) memberships may be added on a
1040 single socket.
1042 To drop a membership, use:
1044 struct ip_mreq mreq;
1045 setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq));
1047 where "mreq" contains the same values as used to add the membership.  The
1048 memberships associated with a socket are also dropped when the socket is
1049 closed or the process holding the socket is killed.  However, more than
1050 one socket may claim a membership in a particular group, and the host
1051 will remain a member of that group until the last claim is dropped.
1053 The memberships associated with a socket do not necessarily determine which
1054 datagrams are received on that socket.  Incoming multicast packets are
1055 accepted by the kernel IP layer if any socket has claimed a membership in the
1056 destination group of the datagram; however, delivery of a multicast datagram
1057 to a particular socket is based on the destination port (or protocol type, for
1058 raw sockets), just as with unicast datagrams.  
1059 To receive multicast datagrams
1060 sent to a particular port, it is necessary to bind to that local port,
1061 leaving the local address unspecified (i.e., INADDR_ANY).
1062 To receive multicast datagrams
1063 sent to a particular group and port, bind to the local port, with
1064 the local address set to the multicast group address.  
1065 Once bound to a multicast address, the socket cannot be used for sending data.
1067 More than one process may bind to the same SOCK_DGRAM UDP port 
1068 or the same multicast group and port if the
1069 .I bind
1070 call is preceded by:
1072 int on = 1;
1073 setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on));
1075 All processes sharing the port must enable this option.
1076 Every incoming multicast or broadcast UDP datagram destined to
1077 the shared port is delivered to all sockets bound to the port.  
1078 For backwards compatibility reasons, this does not apply to incoming
1079 unicast datagrams.  Unicast
1080 datagrams are never delivered to more than one socket, regardless of
1081 how many sockets are bound to the datagram's destination port.
1083 A final multicast-related extension is independent of IP:  two new ioctls,
1084 SIOCADDMULTI and SIOCDELMULTI, are available to add or delete link-level
1085 (e.g., Ethernet) multicast addresses accepted by a particular interface.
1086 The address to be added or deleted is passed as a sockaddr structure of
1087 family AF_UNSPEC, within the standard ifreq structure.
1089 These ioctls are
1090 for the use of protocols other than IP, and require superuser privileges.
1091 A link-level multicast address added via SIOCADDMULTI is not automatically
1092 deleted when the socket used to add it goes away; it must be explicitly
1093 deleted.  It is inadvisable to delete a link-level address that may be
1094 in use by IP.
1095 .NH 3
1096 Sample Multicast Program
1098 The following program sends or receives multicast packets.
1099 If invoked with one argument, it sends a packet containing the current
1100 time to an arbitrarily-chosen multicast group and UDP port.
1101 If invoked with no arguments, it receives and prints these packets.
1102 Start it as a sender on just one host and as a receiver on all the other hosts.
1104 #include <sys/types.h>
1105 #include <sys/socket.h>
1106 #include <netinet/in.h>
1107 #include <arpa/inet.h>
1108 #include <time.h>
1109 #include <stdio.h>
1111 #define EXAMPLE_PORT    60123
1112 #define EXAMPLE_GROUP   "224.0.0.250"
1114 main(argc)
1115     int argc;
1117     struct sockaddr_in addr;
1118     int addrlen, fd, cnt;
1119     struct ip_mreq mreq;
1120     char message[50];
1122     fd = socket(AF_INET, SOCK_DGRAM, 0);
1123     if (fd < 0) {
1124         perror("socket");
1125         exit(1);
1126     }
1128 .ne 1i
1130     bzero(&addr, sizeof(addr));
1131     addr.sin_family = AF_INET;
1132     addr.sin_addr.s_addr = htonl(INADDR_ANY);
1133     addr.sin_port = htons(EXAMPLE_PORT);
1134     addrlen = sizeof(addr);
1135     if (argc > 1) {     /* Send */
1136         addr.sin_addr.s_addr = inet_addr(EXAMPLE_GROUP);
1137         while (1) {
1138             time_t t = time(0);
1139             sprintf(message, "time is %-24.24s", ctime(&t));
1140             cnt = sendto(fd, message, sizeof(message), 0,
1141                     (struct sockaddr *)&addr, addrlen);
1142             if (cnt < 0) {
1143                 perror("sendto");
1144                 exit(1);
1145             }
1146             sleep(5);
1147         }
1148     } else {            /* Receive */
1149         if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
1150             perror("bind");
1151             exit(1);
1152         }
1154         mreq.imr_multiaddr.s_addr = inet_addr(EXAMPLE_GROUP);
1155         mreq.imr_interface.s_addr = htonl(INADDR_ANY);
1156         if (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
1157                     &mreq, sizeof(mreq)) < 0) {
1158             perror("setsockopt mreq");
1159             exit(1);
1160         }
1162         while (1) {
1163             cnt = recvfrom(fd, message, sizeof(message), 0,
1164                             (struct sockaddr *)&addr, &addrlen);
1165             if (cnt <= 0) {
1166                     if (cnt == 0) {
1167                         break;
1168                     }
1169                     perror("recvfrom");
1170                     exit(1);
1171             } 
1172             printf("%s: message = \e"%s\e"\en",
1173                     inet_ntoa(addr.sin_addr), message);
1174         }
1175     }
1177 .\"----------------------------------------------------------------------
1179 .NH 2
1180 NS Packet Sequences
1182 The semantics of NS connections demand that
1183 the user both be able to look inside the network header associated
1184 with any incoming packet and be able to specify what should go
1185 in certain fields of an outgoing packet.
1186 Using different calls to \fIsetsockopt\fP, it is possible
1187 to indicate whether prototype headers will be associated by
1188 the user with each outgoing packet (SO_HEADERS_ON_OUTPUT),
1189 to indicate whether the headers received by the system should be
1190 delivered to the user (SO_HEADERS_ON_INPUT), or to indicate
1191 default information that should be associated with all
1192 outgoing packets on a given socket (SO_DEFAULT_HEADERS).
1194 The contents of a SPP header (minus the IDP header) are:
1196 .if t .ta \w"  #define"u +\w"  u_short"u +2.0i
1197 struct sphdr {
1198         u_char  sp_cc;          /* connection control */
1199 #define SP_SP   0x80            /* system packet */
1200 #define SP_SA   0x40            /* send acknowledgement */
1201 #define SP_OB   0x20            /* attention (out of band data) */
1202 #define SP_EM   0x10            /* end of message */
1204         u_char  sp_dt;          /* datastream type */
1205         u_short sp_sid;         /* source connection identifier */
1206         u_short sp_did;         /* destination connection identifier */
1207         u_short sp_seq;         /* sequence number */
1208         u_short sp_ack;         /* acknowledge number */
1209         u_short sp_alo;         /* allocation number */
1212 Here, the items of interest are the \fIdatastream type\fP and
1213 the \fIconnection control\fP fields.  The semantics of the
1214 datastream type are defined by the application(s) in question;
1215 the value of this field is, by default, zero, but it can be
1216 used to indicate things such as Xerox's Bulk Data Transfer
1217 Protocol (in which case it is set to one).  The connection control
1218 field is a mask of the flags defined just below it.  The user may
1219 set or clear the end-of-message bit to indicate
1220 that a given message is the last of a given substream type,
1221 or may set/clear the attention bit as an alternate way to
1222 indicate that a packet should be sent out-of-band.
1223 As an example, to associate prototype headers with outgoing
1224 SPP packets, consider:
1226 #include <sys/types.h>
1227 #include <sys/socket.h>
1228 #include <netns/ns.h>
1229 #include <netns/sp.h>
1230  ...
1231 struct sockaddr_ns sns, to;
1232 int s, on = 1;
1233 struct databuf {
1234         struct sphdr proto_spp; /* prototype header */
1235         char buf[534];          /* max. possible data by Xerox std. */
1236 } buf;
1237  ...
1238 s = socket(AF_NS, SOCK_SEQPACKET, 0);
1239  ...
1240 bind(s, (struct sockaddr *) &sns, sizeof (sns));
1241 setsockopt(s, NSPROTO_SPP, SO_HEADERS_ON_OUTPUT, &on, sizeof(on));
1242  ...
1243 buf.proto_spp.sp_dt = 1;        /* bulk data */
1244 buf.proto_spp.sp_cc = SP_EM;    /* end-of-message */
1245 strcpy(buf.buf, "hello world\en");
1246 sendto(s, (char *) &buf, sizeof(struct sphdr) + strlen("hello world\en"),
1247     (struct sockaddr *) &to, sizeof(to));
1248  ...
1250 Note that one must be careful when writing headers; if the prototype
1251 header is not written with the data with which it is to be associated,
1252 the kernel will treat the first few bytes of the data as the
1253 header, with unpredictable results.
1254 To turn off the above association, and to indicate that packet
1255 headers received by the system should be passed up to the user,
1256 one might use:
1258 #include <sys/types.h>
1259 #include <sys/socket.h>
1260 #include <netns/ns.h>
1261 #include <netns/sp.h>
1262  ...
1263 struct sockaddr sns;
1264 int s, on = 1, off = 0;
1265  ...
1266 s = socket(AF_NS, SOCK_SEQPACKET, 0);
1267  ...
1268 bind(s, (struct sockaddr *) &sns, sizeof (sns));
1269 setsockopt(s, NSPROTO_SPP, SO_HEADERS_ON_OUTPUT, &off, sizeof(off));
1270 setsockopt(s, NSPROTO_SPP, SO_HEADERS_ON_INPUT, &on, sizeof(on));
1273 Output is handled somewhat differently in the IDP world.
1274 The header of an IDP-level packet looks like:
1276 .if t .ta \w'struct  'u +\w"  struct ns_addr"u +2.0i
1277 struct idp {
1278         u_short idp_sum;        /* Checksum */
1279         u_short idp_len;        /* Length, in bytes, including header */
1280         u_char  idp_tc;         /* Transport Control (i.e., hop count) */
1281         u_char  idp_pt;         /* Packet Type (i.e., level 2 protocol) */
1282         struct ns_addr  idp_dna;        /* Destination Network Address */
1283         struct ns_addr  idp_sna;        /* Source Network Address */
1286 The primary field of interest in an IDP header is the \fIpacket type\fP
1287 field.  The standard values for this field are (as defined
1288 in <\fInetns/ns.h\fP>):
1290 .if t .ta \w"  #define"u +\w"  NSPROTO_ERROR"u +1.0i
1291 #define NSPROTO_RI      1               /* Routing Information */
1292 #define NSPROTO_ECHO    2               /* Echo Protocol */
1293 #define NSPROTO_ERROR   3               /* Error Protocol */
1294 #define NSPROTO_PE      4               /* Packet Exchange */
1295 #define NSPROTO_SPP     5               /* Sequenced Packet */
1297 For SPP connections, the contents of this field are
1298 automatically set to NSPROTO_SPP; for IDP packets,
1299 this value defaults to zero, which means ``unknown''.
1301 Setting the value of that field with SO_DEFAULT_HEADERS is
1302 easy:
1304 #include <sys/types.h>
1305 #include <sys/socket.h>
1306 #include <netns/ns.h>
1307 #include <netns/idp.h>
1308  ...
1309 struct sockaddr sns;
1310 struct idp proto_idp;           /* prototype header */
1311 int s, on = 1;
1312  ...
1314 .ne 1i
1316 s = socket(AF_NS, SOCK_DGRAM, 0);
1317  ...
1318 bind(s, (struct sockaddr *) &sns, sizeof (sns));
1319 proto_idp.idp_pt = NSPROTO_PE;  /* packet exchange */
1320 setsockopt(s, NSPROTO_IDP, SO_DEFAULT_HEADERS, (char *) &proto_idp,
1321     sizeof(proto_idp));
1322  ...
1325 Using SO_HEADERS_ON_OUTPUT is somewhat more difficult.  When
1326 SO_HEADERS_ON_OUTPUT is turned on for an IDP socket, the socket
1327 becomes (for all intents and purposes) a raw socket.  In this
1328 case, all the fields of the prototype header (except the 
1329 length and checksum fields, which are computed by the kernel)
1330 must be filled in correctly in order for the socket to send and
1331 receive data in a sensible manner.  To be more specific, the
1332 source address must be set to that of the host sending the
1333 data; the destination address must be set to that of the
1334 host for whom the data is intended; the packet type must be
1335 set to whatever value is desired; and the hopcount must be
1336 set to some reasonable value (almost always zero).  It should
1337 also be noted that simply sending data using \fIwrite\fP
1338 will not work unless a \fIconnect\fP or \fIsendto\fP call
1339 is used, in spite of the fact that it is the destination
1340 address in the prototype header that is used, not the one
1341 given in either of those calls.  For almost
1342 all IDP applications , using SO_DEFAULT_HEADERS is easier and
1343 more desirable than writing headers.
1344 .NH 2
1345 Three-way Handshake
1347 The semantics of SPP connections indicates that a three-way
1348 handshake, involving changes in the datastream type, should \(em
1349 but is not absolutely required to \(em take place before a SPP
1350 connection is closed.  Almost all SPP connections are
1351 ``well-behaved'' in this manner; when communicating with
1352 any process, it is best to assume that the three-way handshake
1353 is required unless it is known for certain that it is not
1354 required.  In a three-way close, the closing process
1355 indicates that it wishes to close the connection by sending
1356 a zero-length packet with end-of-message set and with
1357 datastream type 254.  The other side of the connection
1358 indicates that it is OK to close by sending a zero-length
1359 packet with end-of-message set and datastream type 255.  Finally,
1360 the closing process replies with a zero-length packet with 
1361 substream type 255; at this point, the connection is considered
1362 closed.  The following code fragments are simplified examples
1363 of how one might handle this three-way handshake at the user
1364 level; in the future, support for this type of close will
1365 probably be provided as part of the C library or as part of
1366 the kernel.  The first code fragment below illustrates how a process
1367 might handle three-way handshake if it sees that the process it
1368 is communicating with wants to close the connection:
1370 #include <sys/types.h>
1371 #include <sys/socket.h>
1372 #include <netns/ns.h>
1373 #include <netns/sp.h>
1374  ...
1375 #ifndef SPPSST_END
1376 #define SPPSST_END 254
1377 #define SPPSST_ENDREPLY 255
1378 #endif
1379 struct sphdr proto_sp;
1380 int s;
1381  ...
1383 .ne 1i
1385 read(s, buf, BUFSIZE);
1386 if (((struct sphdr *)buf)->sp_dt == SPPSST_END) {
1387         /*
1388          * SPPSST_END indicates that the other side wants to
1389          * close.
1390          */
1391         proto_sp.sp_dt = SPPSST_ENDREPLY;
1392         proto_sp.sp_cc = SP_EM;
1393         setsockopt(s, NSPROTO_SPP, SO_DEFAULT_HEADERS, (char *)&proto_sp,
1394             sizeof(proto_sp));
1395         write(s, buf, 0);
1396         /*
1397          * Write a zero-length packet with datastream type = SPPSST_ENDREPLY
1398          * to indicate that the close is OK with us.  The packet that we
1399          * don't see (because we don't look for it) is another packet
1400          * from the other side of the connection, with SPPSST_ENDREPLY
1401          * on it it, too.  Once that packet is sent, the connection is
1402          * considered closed; note that we really ought to retransmit
1403          * the close for some time if we do not get a reply.
1404          */
1405         close(s);
1407  ...
1409 .pl +2
1410 To indicate to another process that we would like to close the
1411 connection, the following code would suffice:
1413 #include <sys/types.h>
1414 #include <sys/socket.h>
1415 #include <netns/ns.h>
1416 #include <netns/sp.h>
1417  ...
1418 #ifndef SPPSST_END
1419 #define SPPSST_END 254
1420 #define SPPSST_ENDREPLY 255
1421 #endif
1422 struct sphdr proto_sp;
1423 int s;
1424  ...
1425 proto_sp.sp_dt = SPPSST_END;
1426 proto_sp.sp_cc = SP_EM;
1427 setsockopt(s, NSPROTO_SPP, SO_DEFAULT_HEADERS, (char *)&proto_sp,
1428     sizeof(proto_sp));
1429 write(s, buf, 0);       /* send the end request */
1430 proto_sp.sp_dt = SPPSST_ENDREPLY;
1431 setsockopt(s, NSPROTO_SPP, SO_DEFAULT_HEADERS, (char *)&proto_sp,
1432     sizeof(proto_sp));
1434  * We assume (perhaps unwisely) that the other side will send the ENDREPLY,
1435  * so we'll just send our final ENDREPLY as if we'd seen theirs already
1436  */
1437 write(s, buf, 0);
1438 close(s);
1439  ...
1441 .NH 2
1442 Packet Exchange
1444 The Xerox standard protocols include a protocol that is both
1445 reliable and datagram-oriented.  This protocol is known as
1446 Packet Exchange (PEX or PE) and, like SPP, is layered on top
1447 of IDP.  PEX is important for a number of things: Courier
1448 remote procedure calls may be expedited through the use
1449 of PEX, and many Xerox servers are located by doing a PEX
1450 ``BroadcastForServers'' operation.  Although there is no
1451 implementation of PEX in the kernel,
1452 it may be simulated at the user level with some clever coding
1453 and the use of one peculiar \fIgetsockopt\fP.  A PEX packet
1454 looks like:
1456 .if t .ta \w'struct  'u +\w"  struct idp"u +2.0i
1458  * The packet-exchange header shown here is not defined
1459  * as part of any of the system include files.
1460  */
1461 struct pex {
1462         struct idp      p_idp;  /* idp header */
1463         u_short ph_id[2];       /* unique transaction ID for pex */
1464         u_short ph_client;      /* client type field for pex */
1467 The \fIph_id\fP field is used to hold a ``unique id'' that
1468 is used in duplicate suppression; the \fIph_client\fP
1469 field indicates the PEX client type (similar to the packet
1470 type field in the IDP header).  PEX reliability stems from the
1471 fact that it is an idempotent (``I send a packet to you, you
1472 send a packet to me'') protocol.  Processes on each side of
1473 the connection may use the unique id to determine if they have
1474 seen a given packet before (the unique id field differs on each
1475 packet sent) so that duplicates may be detected, and to indicate
1476 which message a given packet is in response to.  If a packet with
1477 a given unique id is sent and no response is received in a given
1478 amount of time, the packet is retransmitted until it is decided
1479 that no response will ever be received.  To simulate PEX, one
1480 must be able to generate unique ids -- something that is hard to
1481 do at the user level with any real guarantee that the id is really
1482 unique.  Therefore, a means (via \fIgetsockopt\fP) has been provided
1483 for getting unique ids from the kernel.  The following code fragment
1484 indicates how to get a unique id:
1486 long uniqueid;
1487 int s, idsize = sizeof(uniqueid);
1488  ...
1489 s = socket(AF_NS, SOCK_DGRAM, 0);
1490  ...
1491 /* get id from the kernel -- only on IDP sockets */
1492 getsockopt(s, NSPROTO_PE, SO_SEQNO, (char *)&uniqueid, &idsize);
1493  ...
1495 The retransmission and duplicate suppression code required to
1496 simulate PEX fully is left as an exercise for the reader.
1497 .NH 2
1498 Inetd
1500 One of the daemons provided with 4.4BSD is \fIinetd\fP, the
1501 so called ``internet super-server.''  
1502 Having one daemon listen for requests for many daemons
1503 instead of having each daemon listen for its own requests
1504 reduces the number of idle daemons and simplies their implementation.
1505 .I Inetd
1506 handles
1507 two types of services: standard and TCPMUX.
1508 A standard service has a well-known port assigned to it and
1509 is listed in
1510 .I /etc/services
1511 (see \f2services\f1(5));
1512 it may be a service that implements an official Internet standard or is a
1513 BSD-specific service.
1514 TCPMUX services are nonstandard and do not have a
1515 well-known port assigned to them.
1516 They are invoked from
1517 .I inetd
1518 when a program connects to the "tcpmux" well-known port and specifies
1519 the service name.
1520 This is useful for adding locally-developed servers.
1522 \fIInetd\fP is invoked at boot
1523 time, and determines from the file \fI/etc/inetd.conf\fP the
1524 servers for which it is to listen.  Once this information has been
1525 read and a pristine environment created, \fIinetd\fP proceeds
1526 to create one socket for each service it is to listen for,
1527 binding the appropriate port number to each socket.
1529 \fIInetd\fP then performs a \fIselect\fP on all these
1530 sockets for read availability, waiting for somebody wishing
1531 a connection to the service corresponding to
1532 that socket.  \fIInetd\fP then performs an \fIaccept\fP on
1533 the socket in question, \fIfork\fPs, \fIdup\fPs the new
1534 socket to file descriptors 0 and 1 (stdin and
1535 stdout), closes other open file
1536 descriptors, and \fIexec\fPs the appropriate server.
1538 Servers making use of \fIinetd\fP are considerably simplified,
1539 as \fIinetd\fP takes care of the majority of the IPC work
1540 required in establishing a connection.  The server invoked
1541 by \fIinetd\fP expects the socket connected to its client
1542 on file descriptors 0 and 1, and may immediately perform
1543 any operations such as \fIread\fP, \fIwrite\fP, \fIsend\fP,
1544 or \fIrecv\fP.  Indeed, servers may use
1545 buffered I/O as provided by the ``stdio'' conventions, as
1546 long as as they remember to use \fIfflush\fP when appropriate.
1548 One call which may be of interest to individuals writing
1549 servers under \fIinetd\fP is the \fIgetpeername\fP call,
1550 which returns the address of the peer (process) connected
1551 on the other end of the socket.  For example, to log the
1552 Internet address in ``dot notation'' (e.g., ``128.32.0.4'')
1553 of a client connected to a server under
1554 \fIinetd\fP, the following code might be used:
1556 struct sockaddr_in name;
1557 int namelen = sizeof (name);
1558  ...
1559 if (getpeername(0, (struct sockaddr *)&name, &namelen) < 0) {
1560         syslog(LOG_ERR, "getpeername: %m");
1561         exit(1);
1562 } else
1563         syslog(LOG_INFO, "Connection from %s", inet_ntoa(name.sin_addr));
1564  ...
1566 While the \fIgetpeername\fP call is especially useful when
1567 writing programs to run with \fIinetd\fP, it can be used
1568 under other circumstances.  Be warned, however, that \fIgetpeername\fP will
1569 fail on UNIX domain sockets.
1571 Standard TCP
1572 services are assigned unique well-known port numbers in the range of
1573 0 to 1023 by the
1574 Internet Assigned Numbers Authority (IANA@ISI.EDU).
1575 The limited number of ports in this range are
1576 assigned to official Internet protocols.
1577 The TCPMUX service allows you to add
1578 locally-developed protocols without needing an official TCP port assignment.
1579 The TCPMUX protocol described in RFC-1078 is simple:
1581 ``A TCP client connects to a foreign host on TCP port 1.  It sends the
1582 service name followed by a carriage-return line-feed <CRLF>.
1583 The service name is never case sensitive. 
1584 The server replies with a
1585 single character indicating positive ("+") or negative ("\-")
1586 acknowledgment, immediately followed by an optional message of
1587 explanation, terminated with a <CRLF>.  If the reply was positive,
1588 the selected protocol begins; otherwise the connection is closed.''
1590 In 4.4BSD, the TCPMUX service is built into
1591 .IR inetd ,
1592 that is,
1593 .IR inetd
1594 listens on TCP port 1 for requests for TCPMUX services listed
1595 in \f2inetd.conf\f1.
1596 .IR inetd (8)
1597 describes the format of TCPMUX entries for \f2inetd.conf\f1.
1599 The following is an example TCPMUX server and its \f2inetd.conf\f1 entry.
1600 More sophisticated servers may want to do additional processing
1601 before returning the positive or negative acknowledgement.
1603 #include <sys/types.h>
1604 #include <stdio.h>
1606 main()
1608         time_t t;
1610         printf("+Go\er\en");
1611         fflush(stdout);
1612         time(&t);
1613         printf("%d = %s", t, ctime(&t));
1614         fflush(stdout);
1617 .ne 1i
1618 The \f2inetd.conf\f1 entry is:
1620 tcpmux/current_time stream tcp nowait nobody /d/curtime curtime
1622 Here's the portion of the client code that handles the TCPMUX handshake:
1624 char line[BUFSIZ];
1625 FILE *fp;
1626  ...
1628 /* Use stdio for reading data from the server */
1629 fp = fdopen(sock, "r");
1630 if (fp == NULL) {
1631     fprintf(stderr, "Can't create file pointer\en");
1632     exit(1);
1635 /* Send service request */
1636 sprintf(line, "%s\er\en", "current_time");
1637 if (write(sock, line, strlen(line)) < 0) {
1638     perror("write");
1639     exit(1);
1642 /* Get ACK/NAK response from the server */
1643 if (fgets(line, sizeof(line), fp) == NULL) {
1644     if (feof(fp)) {
1645         die();
1646     } else {
1647         fprintf(stderr, "Error reading response\en");
1648         exit(1);
1649     }
1652 /* Delete <CR> */
1653 if ((lp = index(line, '\r')) != NULL) {
1654     *lp = '\0';
1657 switch (line[0]) {
1658     case '+':
1659             printf("Got ACK: %s\en", &line[1]);
1660             break;
1661     case '-':
1662             printf("Got NAK: %s\en", &line[1]);
1663             exit(0);
1664     default:
1665             printf("Got unknown response: %s\en", line);
1666             exit(1);
1669 /* Get rest of data from the server */
1670 while ((fgets(line, sizeof(line), fp)) != NULL) {
1671     fputs(line, stdout);