|
|
1.1 root 1: /****************************************************************************
2: Microsoft RPC Version 1.0
3: Copyright Microsoft Corp. 1992
4: Doctor Example
5:
6: FILE: Doctorc.c
7: USAGE: doctorc -n network_address
8: -p protocol_sequence
9: -e endpoint
10: -o options
11: -u uuid
12:
13: PURPOSE: Client side of RPC distributed application
14: FUNCTIONS: main() - binds to server and calls remote procedure
15: COMMENTS:
16: This version of the distributed application prints
17: strings from the Doctor server. Doctor is an Eliza-like
18: personal therapist program that works by simple pattern-matching.
19: ****************************************************************************/
20: #include <stdio.h>
21: #include <string.h>
22: #include <stdlib.h>
23: #include <rpc.h> // RPC API functions, types
24: #include "doctor.h" // header file generated by MIDL compiler
25:
26: #define PURPOSE \
27: "This Microsoft RPC Version 1.0 sample program demonstrates\n\
28: the use of the [string] and [size_is] attributes. For more\n\
29: information about attributes and RPC API functions, see the\n\
30: RPC programming guide and reference.\n\n"
31:
32: #define GREETING \
33: "The doctor is in.\n\
34: I am at your service; just tell me anything that troubles\n\
35: or concerns you. Please end your sentences with a period,\n\
36: a question mark, or an exclamation point, and then press\n\
37: the RETURN or ENTER key. When you are ready to quit our\n\
38: session, just enter \"bye\" and press RETURN or ENTER.\n\n\
39: What is your name? >"
40:
41: #define FAREWELL \
42: "I hope I have been of some service to you.\n\
43: Let's get together again some time.\n\n"
44:
45: void Usage(char * pszProgramName)
46: {
47: fprintf(stderr, "%s", PURPOSE);
48: fprintf(stderr, "Usage: %s\n", pszProgramName);
49: fprintf(stderr, " -p protocol_sequence\n");
50: fprintf(stderr, " -n network_address\n");
51: fprintf(stderr, " -e endpoint\n");
52: fprintf(stderr, " -o options\n");
53: fprintf(stderr, " -u uuid\n");
54: exit(1);
55: }
56:
57: #define STRSIZE 500
58:
59: void main(int argc, char **argv)
60: {
61: RPC_STATUS status; // returned by RPC API function
62: char pszName[STRSIZE]; // patient name
63: char achIn[STRSIZE]; // patient input
64:
65: unsigned char * pszUuid = "12345678-1234-1234-1234-123456789ABC";
66: unsigned char * pszProtocolSequence = "ncacn_np";
67: unsigned char * pszNetworkAddress = NULL;
68: unsigned char * pszEndpoint = "\\pipe\\doctor";
69: unsigned char * pszOptions = NULL;
70: unsigned char * pszStringBinding = NULL;
71: int i;
72:
73: // allow the user to override settings with command line switches
74: for (i = 1; i < argc; i++) {
75: if ((*argv[i] == '-') || (*argv[i] == '/')) {
76: switch (tolower(*(argv[i]+1))) {
77: case 'p': // protocol sequence
78: pszProtocolSequence = argv[++i];
79: break;
80: case 'n': // network address
81: pszNetworkAddress = argv[++i];
82: break;
83: case 'e':
84: pszEndpoint = argv[++i];
85: break;
86: case 'o':
87: pszOptions = argv[++i];
88: break;
89: case 'u':
90: pszUuid = argv[++i];
91: break;
92: case 'h':
93: case '?':
94: default:
95: Usage(argv[0]);
96: }
97: }
98: else
99: Usage(argv[0]);
100: }
101: /* Use a convenience function to concatenate the elements of */
102: /* the string binding into the proper sequence. */
103:
104: status = RpcStringBindingCompose(pszUuid,
105: pszProtocolSequence,
106: pszNetworkAddress,
107: pszEndpoint,
108: pszOptions,
109: &pszStringBinding);
110: if (status) {
111: printf("RpcStringBindingCompose returned 0x%x\n", status);
112: printf("pszStringBinding = %s\n", pszStringBinding);
113: exit(2);
114: }
115:
116: /* Set the binding handle that will be used to bind to the server. */
117:
118: status = RpcBindingFromStringBinding(pszStringBinding,
119: &doctor_IfHandle);
120: if (status) {
121: printf("RpcBindingFromStringBinding returned 0x%x\n", status);
122: exit(2);
123: }
124: /* RPC is now initialized. call remote procedures as if they */
125: /* were local procedures. */
126:
127: /* The doctor program consists of patient statements and doctor*/
128: /* responses. The patient string is transmitted to the server,*/
129: /* and all processing is performed on the server. */
130:
131: printf("%s", GREETING);
132: gets(pszName);
133: printf("\n%s>", pszName);
134:
135: while (gets(achIn))
136: {
137: if (strcmp(achIn, "bye") == 0) // end of session?
138: break;
139: Analyze(&achIn[0]);
140: printf("%s%s>", achIn, pszName); // no, continue
141: }
142:
143: Shutdown(); // yes, shutdown the server
144:
145: /* The calls to the remote procedure are complete. Free the binding handle */
146:
147: status = RpcBindingFree(&doctor_IfHandle); // remote calls done; unbind
148: if (status) {
149: printf("RpcBindingFree returned 0x%x\n", status);
150: exit(2);
151: }
152:
153: printf("%s", FAREWELL);
154: exit(0);
155:
156: } /* end main */
157:
158: void * MIDL_user_allocate(size_t len)
159: {
160: return(malloc(len));
161: }
162:
163: void MIDL_user_free(void * ptr)
164: {
165: free(ptr);
166: }
167:
168: /* end doctorc.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.