Annotation of mstools/samples/npclient/readme.txt, revision 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