|
|
1.1 root 1: /****************************************************************************
2: Microsoft RPC Version 1.0
3: Copyright Microsoft Corp. 1992
4: xmit Example
5:
6: FILE: xmits.c
7: USAGE: xmits -n network_address
8: -p protocol_sequence
9: -e endpoint
10: -o options
11: -u uuid
12:
13: PURPOSE: Server side of RPC distributed application xmit
14: FUNCTIONS: main() - registers server as RPC server
15:
16: PDOUBLE_LINK_TYPE_to_xmit - convert list to array
17: PDOUBLE_LINK_TYPE_from_xmit - convert array to list
18: PDOUBLE_LINK_TYPE_free_inst - free linked list memory
19: PDOUBLE_LINK_TYPE_free_xmit - free array memory
20: MIDL_user_allocate - user-supplied memory allocator
21: MIDL_user_free - user-supplied routine to free memory
22:
23: ArrayWalkProc - utility to display the array
24: ListWalkProc - utility to display the linked list
25: InsertNewNode - utility to add a node to the list
26:
27: COMMENTS: This sample program generates a linked list to
28: demonstrate how the list can be transmitted over
29: the network more efficiently as a sized array.
30: The pointers are rebuilt on the server side.
31:
32: The [transmit_as] attribute (used in the typedef of
33: PDOUBLE_LINK_TYPE in the file XMIT.IDL) requires the
34: four user-supplied functions whose names start with
35: the name of the presented type, PDOUBLE_LINK_TYPE.
36:
37: The [in, out] attributes applied to remote procedure
38: parameters require the two user-supplied functions
39: MIDL_user_allocate and MIDL_user_free.
40:
41: The other functions are utilities that are used to
42: build or display the data structures.
43: ****************************************************************************/
44: #include <stdlib.h>
45: #include <windows.h>
46: #include <string.h>
47: #include <stdio.h>
48: #include <ctype.h>
49: #include <rpc.h> // RPC data structures and APIs
50: #include "xmit.h" // header file generated by MIDL compiler
51:
52: #define PURPOSE \
53: "This Microsoft RPC Version 1.0 sample program demonstrates\n\
54: the use of the [transmit_as] attribute. For more information\n\
55: about the attributes and the RPC API functions, see the\n\
56: RPC programming guide and reference.\n\n"
57:
58:
59: void Usage(char * pszProgramName)
60: {
61: fprintf(stderr, "%s", PURPOSE);
62: fprintf(stderr, "Usage: %s\n", pszProgramName);
63: fprintf(stderr, " -p protocol_sequence\n");
64: fprintf(stderr, " -n network_address\n");
65: fprintf(stderr, " -e endpoint\n");
66: fprintf(stderr, " -o options\n");
67: fprintf(stderr, " -u uuid\n");
68: exit(1);
69: }
70:
71: /* adds a new node to the linked list */
72: /* assign the new node the value sValue and place after pPrevious */
73: DOUBLE_LINK_TYPE * InsertNewNode(short sValue, DOUBLE_LINK_TYPE * pPrevious)
74: {
75: DOUBLE_LINK_TYPE * pNew;
76:
77: pNew = (DOUBLE_LINK_TYPE *) malloc(sizeof(DOUBLE_LINK_TYPE));
78: if (pNew != NULL) {
79: pNew->sNumber = sValue; /* insert b between a and c */
80: pNew->pPrevious = pPrevious; /* prev(b) = a */
81: if (pPrevious != NULL) {
82: pNew->pNext = pPrevious->pNext; /* next(b) = c */
83: pPrevious->pNext = pNew; /* next(a) = b */
84: if (pNew->pNext != NULL)
85: (pNew->pNext)->pPrevious = pNew; /* prev(c) = b */
86: }
87: else
88: pNew->pNext = NULL;
89: }
90: return(pNew);
91: }
92:
93: /* display the contents of the array */
94: void ArrayWalkProc(PDOUBLE_XMIT_TYPE pArray)
95: {
96: int i;
97: printf("Display contents of transmitted array:\n");
98:
99: for (i = 0; i < pArray->sSize; i++)
100: printf("pArray->asNumber[%d] = %d\n", i, pArray->asNumber[i]);
101: }
102:
103: /* display the contents of the linked list */
104: void ListWalkProc(DOUBLE_LINK_TYPE * pList)
105: {
106: printf("Display contents of doubly linked list:\n");
107: while (pList != NULL) {
108: printf("pList @0x%x = %d, Next = 0x%x\n", pList, pList->sNumber, pList->pNext);
109: pList = pList->pNext;
110: }
111: }
112:
113: void * MIDL_user_allocate(size_t len)
114: {
115: return(malloc(len));
116: }
117:
118: void MIDL_user_free(void * ptr)
119: {
120: free(ptr);
121: }
122:
123: /* free the doubly linked list */
124: void DOUBLE_LINK_TYPE_free_inst (DOUBLE_LINK_TYPE * pList)
125: {
126: while (pList->pNext != NULL) /* go to end of list */
127: pList = pList->pNext;
128: for (pList = pList->pPrevious; pList != NULL; pList = pList->pPrevious)
129: free(pList->pNext);
130: }
131:
132: /* free the array structure */
133: void DOUBLE_LINK_TYPE_free_xmit (DOUBLE_XMIT_TYPE * pSizedArray)
134: {
135: free(pSizedArray);
136: }
137:
138:
139: /* convert from linked list to array */
140: void DOUBLE_LINK_TYPE_to_xmit (DOUBLE_LINK_TYPE * pList,
141: DOUBLE_XMIT_TYPE ** ppArray)
142: {
143: short cCount = 0;
144: DOUBLE_LINK_TYPE * pHead = pList; /* save pointer to start */
145: DOUBLE_XMIT_TYPE * pArray;
146:
147: /* count the number of elements to allocate memory */
148: for (; pList != NULL; pList = pList->pNext)
149: cCount++;
150:
151: /* allocate the memory for the array */
152: pArray = (DOUBLE_XMIT_TYPE *) malloc(sizeof(DOUBLE_XMIT_TYPE) + (cCount * sizeof(short)));
153: pArray->sSize = cCount;
154:
155: /* copy the linked list contents into the array */
156: cCount = 0;
157: for (pList = pHead; pList != NULL; pList = pList->pNext)
158: pArray->asNumber[cCount++] = pList->sNumber;
159:
160: /* return the address of the pointer to the array */
161: *ppArray = pArray;
162: }
163:
164: /* convert from array to linked list */
165: void DOUBLE_LINK_TYPE_from_xmit (DOUBLE_XMIT_TYPE * pArray,
166: DOUBLE_LINK_TYPE * pDblLinkedList)
167: {
168: PDOUBLE_LINK_TYPE pCurrent, pNew;
169:
170: int i;
171:
172: pCurrent = pDblLinkedList;
173: pCurrent->sNumber = pArray->asNumber[0];
174:
175: DOUBLE_LINK_TYPE_free_inst(pCurrent);
176: pCurrent->pNext = NULL; /* wipe out pointer to old list */
177:
178: for (i = 1; i < pArray->sSize; i++) {
179: pNew = InsertNewNode(pArray->asNumber[i], pCurrent);
180: pCurrent = pNew;
181: }
182: return;
183: }
184:
185: /* main: register the interface, start listening for clients */
186: void main(int argc, char * argv[])
187: {
188: RPC_STATUS status;
189: unsigned char * pszUuid = "12345678-1234-1234-1234-123456789ABC";
190: unsigned char * pszProtocolSequence = "ncacn_np";
191: unsigned char * pszNetworkAddress = NULL;
192: unsigned char * pszEndpoint = "\\pipe\\xmit";
193: unsigned char * pszOptions = NULL;
194: unsigned char * pszStringBinding = NULL;
195: int i;
196:
197: // allow the user to override settings with command line switches
198: for (i = 1; i < argc; i++) {
199: if ((*argv[i] == '-') || (*argv[i] == '/')) {
200: switch (tolower(*(argv[i]+1))) {
201: case 'p': // protocol sequence
202: pszProtocolSequence = argv[++i];
203: break;
204: case 'n': // network address
205: pszNetworkAddress = argv[++i];
206: break;
207: case 'e':
208: pszEndpoint = argv[++i];
209: break;
210: case 'o':
211: pszOptions = argv[++i];
212: break;
213: case 'u':
214: pszUuid = argv[++i];
215: break;
216: case 'h':
217: case '?':
218: default:
219: Usage(argv[0]);
220: }
221: }
222: else
223: Usage(argv[0]);
224: }
225:
226: status = RpcServerUseProtseqEp(pszProtocolSequence,
227: 1, // maximum concurrent calls
228: pszEndpoint,
229: 0);
230: printf("RpcServerUseProtseqEp returned 0x%x\n", status);
231: if (status) {
232: exit(2);
233: }
234:
235: status = RpcServerRegisterIf(xmit_ServerIfHandle, 0, 0);
236: printf("RpcServerRegisterIf returned 0x%x\n", status);
237: if (status) {
238: exit(2);
239: }
240:
241: printf("Calling RpcServerListen\n");
242: status = RpcServerListen(1,
243: 20);
244: printf("RpcServerListen returned: 0x%x\n", status);
245: if (status) {
246: exit(2);
247: }
248:
249: } /* end main() */
250:
251: /* end xmits.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.