|
|
1.1 root 1: /****************************************************************************
2: Microsoft RPC Version 1.0
3: Copyright Microsoft Corp. 1992
4: Callback Example
5:
6: FILE: callc.c
7:
8: USAGE: callc -n network_address
9: -p protocol_sequence
10: -e endpoint
11: -o options
12: -v value to compute fibonacci number
13:
14: PURPOSE: Client side of RPC distributed application
15:
16: FUNCTIONS: main() - binds to server and calls remote procedure
17:
18: COMMENTS: This sample program generates a Fibonacci number by
19: static callback.
20:
21: ****************************************************************************/
22:
23: #include <stdlib.h>
24: #include <stdio.h>
25: #include <ctype.h>
26: #include "call.h" // header file generated by MIDL compiler
27:
28: void Usage(char * pszProgramName)
29: {
30: fprintf(stderr, "Usage: %s\n", pszProgramName);
31: fprintf(stderr, " -p protocol_sequence\n");
32: fprintf(stderr, " -n network_address\n");
33: fprintf(stderr, " -e endpoint\n");
34: fprintf(stderr, " -o options\n");
35: fprintf(stderr, " -v value_for_Fibonacci\n");
36: exit(1);
37: }
38:
39: void _CRTAPI1 main(int argc, char **argv)
40: {
41: RPC_STATUS status;
42: unsigned char * pszUuid = NULL;
43: unsigned char * pszProtocolSequence = "ncacn_np";
44: unsigned char * pszNetworkAddress = NULL;
45: unsigned char * pszEndpoint = "\\pipe\\callback";
46: unsigned char * pszOptions = NULL;
47: unsigned char * pszStringBinding = NULL;
48: short sValue = 2;
49: short sFibNumber;
50: int i;
51:
52: /* allow the user to override settings with command line switches */
53: for (i = 1; i < argc; i++) {
54: if ((*argv[i] == '-') || (*argv[i] == '/')) {
55: switch (tolower(*(argv[i]+1))) {
56: case 'p': // protocol sequence
57: pszProtocolSequence = argv[++i];
58: break;
59: case 'n': // network address
60: pszNetworkAddress = argv[++i];
61: break;
62: case 'e':
63: pszEndpoint = argv[++i];
64: break;
65: case 'o':
66: pszOptions = argv[++i];
67: break;
68: case 'v':
69: sValue = atoi(argv[++i]);
70: break;
71: case 'h':
72: case '?':
73: default:
74: Usage(argv[0]);
75: }
76: }
77: else
78: Usage(argv[0]);
79: }
80:
81: /* Use a convenience function to concatenate the elements of */
82: /* the string binding into the proper sequence. */
83: status = RpcStringBindingCompose(pszUuid,
84: pszProtocolSequence,
85: pszNetworkAddress,
86: pszEndpoint,
87: pszOptions,
88: &pszStringBinding);
89: printf("RpcStringBindingCompose returned 0x%x\n", status);
90: printf("pszStringBinding = %s\n", pszStringBinding);
91: if (status) {
92: exit(status);
93: }
94:
95: /* Set the binding handle that will be used to bind to the server. */
96: status = RpcBindingFromStringBinding(pszStringBinding,
97: &callback_IfHandle);
98: printf("RpcBindingFromStringBinding returned 0x%x\n", status);
99: if (status) {
100: exit(status);
101: }
102:
103: printf("Calling 'Fibonacci(n)' for n = %d\n", sValue);
104:
105: RpcTryExcept {
106: sFibNumber = Fibonacci(sValue); // make call
107: printf("The Fibonacci number of %d = %d\n", sValue, sFibNumber);
108: printf("Calling the remote procedure 'Shutdown'\n");
109: Shutdown(); // shut down the server side
110: }
111: RpcExcept(1) {
112: printf("Runtime library reported an exception\n");
113: }
114: RpcEndExcept
115:
116: /* The calls to the remote procedures are complete. */
117: /* Free the string and the binding handle */
118: status = RpcStringFree(&pszStringBinding); // remote calls done; unbind
119: printf("RpcStringFree returned 0x%x\n", status);
120: if (status) {
121: exit(status);
122: }
123:
124: status = RpcBindingFree(&callback_IfHandle); // remote calls done; unbind
125: printf("RpcBindingFree returned 0x%x\n", status);
126: if (status) {
127: exit(status);
128: }
129:
130: exit(0);
131:
132: } // end main()
133:
134: /* callback function */
135: short Fibonacci2(short n)
136: {
137: short nsub1, nsub2;
138:
139: printf("Callback: Fibonacci2 called with n = %d\n", n);
140: if ((n == 0) || (n == 1))
141: return(1);
142: else {
143: nsub1 = n - 1;
144: nsub2 = n - 2;
145: return(Fibonacci(nsub1) + Fibonacci(nsub2));
146: }
147: }
148:
149:
150: /*********************************************************************/
151: /* MIDL allocate and free */
152: /*********************************************************************/
153:
154: void __RPC_FAR * __RPC_API midl_user_allocate(size_t len)
155: {
156: return(malloc(len));
157: }
158:
159: void __RPC_API midl_user_free(void __RPC_FAR * ptr)
160: {
161: free(ptr);
162: }
163:
164: /* end file callc.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.