|
|
1.1 root 1: /****************************************************************************
2: Microsoft RPC Version 1.0
3: Copyright Microsoft Corp. 1992
4: Cluuid Example
5:
6: FILE: cluuids.c
7:
8: USAGE: cluuids -p protocol_sequence
9: -e endpoint
10: -m max calls
11: -n min calls
12: -f flag for RpcServerListen
13: -1 client object uuid
14: -2 manager epv uuid
15:
16: PURPOSE: Server side of RPC distributed application hello
17:
18: FUNCTIONS: main() - registers server as RPC server
19:
20: COMMENTS: Print "hello, world" on the server.
21: When you supply a type UUID, the client must
22: supply the same UUID.
23:
24: ****************************************************************************/
25:
26: #include <stdio.h>
27: #include <stdlib.h>
28: #include <string.h>
29: #include <ctype.h>
30: #include "cluuid.h" // header file generated by MIDL compiler
31:
32: // the second implementation of the remote procedure
33: extern void HelloProc2(unsigned char * pszString);
34:
35: #define PURPOSE \
36: "This Microsoft RPC Version 1.0 sample program demonstrates how\n\
37: to supply multiple implementations of the remote procedure\n\
38: specified in the interface. It also demonstrates how the client\n\
39: selects among the implementations by providing a client object uuid.\n\n"
40:
41: #define NULL_UUID_STRING "00000000-0000-0000-0000-000000000000"
42:
43: void Usage(char * pszProgramName)
44: {
45: fprintf(stderr, "%s", PURPOSE);
46: fprintf(stderr, "Usage: %s\n", pszProgramName);
47: fprintf(stderr, " -p protocol_sequence\n");
48: fprintf(stderr, " -e endpoint\n");
49: fprintf(stderr, " -m maxcalls\n");
50: fprintf(stderr, " -n mincalls\n");
51: fprintf(stderr, " -f flag_wait_op\n");
52: fprintf(stderr, " -1 client uuid\n");
53: fprintf(stderr, " -2 manager uuid\n");
54: exit(1);
55: }
56:
57: /* main: register the interface, start listening for clients */
58: void _CRTAPI1 main(int argc, char * argv[])
59: {
60: RPC_STATUS status;
61: UUID MgrTypeUuid, ClientUuid;
62: unsigned char * pszProtocolSequence = "ncacn_np";
63: unsigned char * pszSecurity = NULL;
64: unsigned char * pszClientUuid = NULL_UUID_STRING;
65: unsigned char * pszMgrTypeUuid = "11111111-1111-1111-1111-111111111111";
66: unsigned char * pszEndpoint = "\\pipe\\cluuid";
67: unsigned int cMinCalls = 1;
68: unsigned int cMaxCalls = 20;
69: unsigned int fDontWait = FALSE;
70: int i;
71:
72: cluuid_SERVER_EPV epv2; // the mgr_epv for the 2nd implementation
73:
74: /* allow the user to override settings with command line switches */
75: for (i = 1; i < argc; i++) {
76: if ((*argv[i] == '-') || (*argv[i] == '/')) {
77: switch (tolower(*(argv[i]+1))) {
78: case 'p': // protocol sequence
79: pszProtocolSequence = argv[++i];
80: break;
81: case 'e':
82: pszEndpoint = argv[++i];
83: break;
84: case 'm':
85: cMaxCalls = (unsigned int) atoi(argv[++i]);
86: break;
87: case 'n':
88: cMinCalls = (unsigned int) atoi(argv[++i]);
89: break;
90: case 'f':
91: fDontWait = (unsigned int) atoi(argv[++i]);
92: break;
93: case '1':
94: pszMgrTypeUuid = argv[++i];
95: break;
96: case '2':
97: pszClientUuid = argv[++i];
98: break;
99: case 'h':
100: case '?':
101: default:
102: Usage(argv[0]);
103: }
104: }
105: else
106: Usage(argv[0]);
107: }
108:
109: status = RpcServerUseProtseqEp(pszProtocolSequence,
110: cMaxCalls,
111: pszEndpoint,
112: pszSecurity); // Security descriptor
113: printf("RpcServerUseProtseqEp returned 0x%x\n", status);
114: if (status) {
115: exit(status);
116: }
117:
118: status = UuidFromString(pszClientUuid, &ClientUuid);
119: printf("UuidFromString returned 0x%x = %d\n", status, status);
120: if (status) {
121: exit(status);
122: }
123:
124: status = UuidFromString(pszMgrTypeUuid, &MgrTypeUuid);
125: printf("UuidFromString returned 0x%x = %d\n", status, status);
126: if (status) {
127: exit(status);
128: }
129: if (strcmp (pszMgrTypeUuid, NULL_UUID_STRING) == 0) {
130: printf("Register object using non-null uuid %s\n", pszMgrTypeUuid);
131: exit(1);
132: }
133:
134: if (strcmp (pszClientUuid, NULL_UUID_STRING) == 0) {
135: printf("Register object using non-null uuid %s\n", pszMgrTypeUuid);
136: ClientUuid = MgrTypeUuid;
137: }
138:
139: RpcObjectSetType(&ClientUuid, &MgrTypeUuid); // associate type UUID with nil UUID
140: printf("RpcObjectSetType returned 0x%x\n", status);
141: if (status) {
142: exit(status);
143: }
144:
145: status = RpcServerRegisterIf(cluuid_ServerIfHandle, // interface to register
146: NULL, // MgrTypeUuid
147: NULL); // MgrEpv; null means use default
148: printf("RpcServerRegisterIf returned 0x%x\n", status);
149: if (status) {
150: exit(status);
151: }
152:
153: /* register the second manager epv and associate it with the
154: specified uuid. the second uuid must be non-null so that
155: it will not conflict with the NULL uuid already registered
156: for this interface
157: */
158: epv2.HelloProc = HelloProc2;
159: epv2.Shutdown = Shutdown;
160: status = RpcServerRegisterIf(cluuid_ServerIfHandle, // interface to register
161: &MgrTypeUuid, // MgrTypeUuid
162: &epv2); // 2nd manager epv
163: printf("RpcServerRegisterIf returned 0x%x\n", status);
164: if (status) {
165: exit(status);
166: }
167:
168: printf("Calling RpcServerListen\n");
169: status = RpcServerListen(cMinCalls,
170: cMaxCalls,
171: fDontWait);
172: printf("RpcServerListen returned: 0x%x\n", status);
173: if (status) {
174: exit(status);
175: }
176:
177: if (fDontWait) {
178: printf("Calling RpcMgmtWaitServerListen\n");
179: status = RpcMgmtWaitServerListen(); // wait operation
180: printf("RpcMgmtWaitServerListen returned: 0x%x\n", status);
181: if (status) {
182: exit(status);
183: }
184: }
185:
186: } // end main()
187:
188:
189: /*********************************************************************/
190: /* MIDL allocate and free */
191: /*********************************************************************/
192:
193: void __RPC_FAR * __RPC_API midl_user_allocate(size_t len)
194: {
195: return(malloc(len));
196: }
197:
198: void __RPC_API midl_user_free(void __RPC_FAR * ptr)
199: {
200: free(ptr);
201: }
202:
203:
204: /* end file cluuids.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.