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