Annotation of mstools/samples/npclient/readme.txt, revision 1.1.1.1

1.1       root        1: Sample: Named Pipe Client/Server Demonstration
                      2: 
                      3: Summary:
                      4: 
                      5: NPCLIENT and NPSERVER demonstrate the use of named pipes.
                      6: The basic design consist of a server application serving
                      7: multiple client applications.  The user can use the client
                      8: applications as an interface to all of the other client
                      9: applications via the server.  The effect is a simple
                     10: communication program that can be used over the network
                     11: between multiple clients.
                     12: 
                     13: More Information:
                     14: 
                     15: The actual implementation works by having the NPSERVER
                     16: application launch a new thread, which creates and services
                     17: a new instance of the server side of the named pipe every
                     18: time a client connects to it.  You need only start one
                     19: instance of the NPSERVER application.  It will service up to
                     20: 100 instances of the NPCLIENT application.  (Note that the
                     21: 100 instance limit is hard coded into the sample.  It does
                     22: not reflect the number of named pipe instances you can
                     23: create, which is virtually infinite.)
                     24: 
                     25: TO USE:
                     26: 
                     27: Start an instance of NPSERVER.  A window will appear.
                     28: 
                     29: Start an instance of NPCLIENT.  Two dialog boxes will
                     30: appear, one on top of the other.  The top level dialog box
                     31: will prompt you for a share name and a client or user name.
                     32: If the instance of NPCLIENT is local to (on the same machine
                     33: as) the NPSERVER instance, enter a '.' for the share name.
                     34: Otherwise, enter the machine name of the server that the
                     35: NPSERVER instance was started on, i.e. 'FoobarServer'.  For
                     36: the client or user name, enter any name you wish to be
                     37: identified with.  Hit enter or click the OK button.
                     38: 
                     39: The upper dialog box will go away, and you'll see the Client
                     40: dialog box of NPCLIENT.  It consists of two edit fields and
                     41: a 'Send' button.  You will be able to read messages from
                     42: other clients (and yourself) in the larger/upper edit field.
                     43: (Note, if the message seems garbled, make sure the cursor of
                     44: the edit field is located in the lower left hand corner of
                     45: the field.)  The smaller edit field is used to type
                     46: messages.  To send a message: type something in the
                     47: lower/smaller edit field, and hit enter or click the Send
                     48: button.  The message will appear in the larger edit field of
                     49: all the clients connected to the NPSERVER instance;
                     50: prepended by the user name you selected.  Note that the user
                     51: name you selected will be entered into the caption bar of
                     52: the NPCLIENT instance.  This allows you to more easily keep
                     53: track of multiple instances of NPCLIENT on the same machine.
                     54: 
                     55: At the same time the top level dialog box was dismissed from
                     56: the NPCLIENT instance, the NPSERVER window was updated with
                     57: the picture of a red spool of thread accompanied by the user
                     58: name you selected.  This red spool indicates an active
                     59: client thread connected to NPSERVER.  The spool may be
                     60: connected to other spools with a thin blue line (similar to
                     61: the way the File Manager connects files or directories).
                     62: Any time a client disconnects from NPSERVER; the spool
                     63: representing it will be grayed out.
                     64: 
                     65: DESIGN:
                     66: 
                     67: Basically, the NPSERVER application launches multiple
                     68: instances of a server thread.  When the application is
                     69: started, the first thread is created.  It creates an
                     70: instance of the server side of the named pipe, and waits for
                     71: a client to connect.  Once a client connects, another thread
                     72: is started and it too blocks waiting for a client.
                     73: Meanwhile, the first thread updates a global array of client
                     74: information with this specific client's information.  The
                     75: thread then enters a loop reading from this client.  Any
                     76: time this specific client sends a message, this server
                     77: thread will call a function (TellAll) which will write the
                     78: message to all the clients that have been listed in the
                     79: global array.
                     80: 
                     81: On the client side, NPCLIENT tries to connect to the named
                     82: pipe with a CreateFile call.  Once it has connected, it
                     83: creates a thread which loops and reads any message from the
                     84: server side.  Once a message is read, it is printed in the
                     85: larger edit field.  Any time the user hits the Send button,
                     86: the main thread grabs any text in the lower edit field, and
                     87: writes it to the server.
                     88: 
                     89: The steps between NPSERVER and an instance of NPCLIENT looks
                     90: like this:
                     91: 
                     92:    NPSERVER                          NPCLIENT
                     93:    --------                          --------
                     94: 
                     95:    CreateNamedPipe()
                     96:    ConnectPipe()   // Blocks
                     97:                                       CreateFile()  //Connects to pipe.
                     98:                                       spawn separate thread to read pipe
                     99:    return from block
                    100:    updates array of clients
                    101:    spawn another server thread
                    102:    Loop
                    103:      ReadFile() // Blocks on overlap
                    104:                                       WriteFile() // User hits Send.
                    105: 
                    106:      return from block
                    107:      WriteFile() // Broadcast to clients
                    108:    End loop      // When client breaks pipe.
                    109: 
                    110: 
                    111:                                       ReadPipe Thread:
                    112:                                         Loop
                    113:                                           ReadFile()
                    114:                                             block till server broadcasts
                    115: 
                    116:                                             return from block.
                    117:                                             put string in edit field.
                    118: 
                    119:                                          End loop // when server breaks.
                    120: 
                    121: The overlapped structure should be used anytime a pipe is
                    122: expected to block for any length of time on a read or write.
                    123: This allows the thread to return immediately from a read or
                    124: write to service any other part of your application.  The
                    125: overlapped structure should also be used on a named pipe
                    126: anytime you expect to do simultaneous reads and writes.  A
                    127: minor disadvantage of having to use the overlapped structure
                    128: is that you must update the file pointer in the buffer (or
                    129: in a file) manually.  This is done by manually modifying the
                    130: offset field of the overlapped structure after each read.
                    131: The offset is obtained from the GetOverlappedResult call.
                    132: 
                    133: 

unix.superglobalmegacorp.com