-----------------------------------------------------------------------
    This package provides a quick-and-easy means of providing reliable
    and large-packet communication between processes.

    It is described further in the man page stream(3) and at length in the
    document by Don Libes entitled "Packet-Oriented Communications Using a
    Stream Protocol --or-- Making TCP/IP on Berkeley UNIX a Little More
    Pleasant to Use", NISTIR 90-4232, January 1990.

    It is especially nice because initport() does all the hard work of
    initializing TCP connections, and select_server_stream() does the
    hard work of connecting processes to each other.

    If you are running on 4.3BSD, you should add -DBSD4_3 in the Makefile.
    Otherwise, this will compile for a 4.2BSD system.

    To install, type

	    make install

    To test, type

	    make test
	    reader
	    writer	(in different window)
	    writer  (in yet another window)
	    writer  (in yet ...)
	    and so on.


    reader and writer are two programs that should communicate with
    each other.  Type things into any of the writers and reader will
    print it out prefaced by the file descriptor the data came in on.

    Bugs and problems to Don Libes
    National Bureau of Standards
    Bldg 220, Rm A-127
    Gaithersburg, MD  20899
    (301) 975-3535


    SYNOPSIS

    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <inet.h>

	    cc [options] [files] sized_io.o stream.o

    DESCRIPTION

    This package implements packet or stream IO between a server process and
    a number of client processes, using the TCP/IP (stream) facilities.

    A client uses the call:

	    s = initport(PORT_NUMBER(XXX),CLIENT,SOCK_STREAM);

    s is the server's data socket and is used as a file descriptor in further
    communication.  The port may be specified by name (PORT_NAME("foo")), if it
    is registered.

    Similarly, the server uses the following call:

	    s = initport(PORT_NUMBER(XXX),SERVER,SOCK_STREAM);

    s is the server's connection socket.  To receive data or connections, the
    server calls select_server_stream().

	    client = select_server_stream(s,&fds);

    This returns a file descriptor corresponding to a client, when a client has
    sent a message to the server.  It handles initial connections as well as
    client deaths.  s is the server's connection socket that was returned by
    initport().  fds is an int used by select...() for storing a bit string
    corresponding to client sockets.  Initialize it to 0, and don't mess with it
    after that.

    To use the file descriptors in a stream-oriented manner, use read() and
    write().  To use the file descriptors in a packet-oriented manner, use
    sized_read() and sized_write().  The sized...() calls read and write one
    packet at a time, while packet boundaries are ignored in read() and write().

	    cc = sized_read(fd,buffer,maxsize)
	    cc = sized_write(fd,buffer,size)

    The arguments for sized_read() and sized_write() are very similar to read()
    and write().  The only difference is that in sized_read(), maxsize is the
    maximum size of an acceptable packet.
    -----------------------------------------------------------------------