/**************************************************************************** Microsoft RPC Version 2.0 Copyright Microsoft Corp. 1992 - 2000 xmit Example FILE: xmits.c USAGE: xmits -p protocol_sequence -e endpoint -m max calls -n min calls -f flag for RpcServerListen PURPOSE: Server side of RPC distributed application xmit FUNCTIONS: main() - registers server as RPC server COMMENTS: This sample program generates a linked list to demonstrate how the list can be transmitted over the network more efficiently as a sized array. The pointers are rebuilt on the server side. The [transmit_as] attribute (used in the typedef of DOUBLE_LINK_TYPE in the file XMIT.IDL) requires the four user-supplied functions whose names start with the name of the presented type, DOUBLE_LINK_TYPE. The [in, out] attributes applied to remote procedure parameters require the two user-supplied functions midl_user_allocate and midl_user_free. The other functions are utilities that are used to build or display the data structures. ****************************************************************************/ #include #include #include #include "xmit.h" // header file generated by MIDL compiler #include "xmitu.h" // Function prototypes for utility functions #define PURPOSE \ "This Microsoft RPC Version 2.0 sample program demonstrates\n\ the use of the [transmit_as] attribute. For more information\n\ about the attributes and the RPC API functions, see the\n\ RPC programming guide and reference.\n\n" void Usage(char * pszProgramName) { fprintf(stderr, "%s", PURPOSE); fprintf(stderr, "Usage: %s\n", pszProgramName); fprintf(stderr, " -p protocol_sequence\n"); fprintf(stderr, " -e endpoint\n"); fprintf(stderr, " -m maxcalls\n"); fprintf(stderr, " -n mincalls\n"); fprintf(stderr, " -f flag_wait_op\n"); exit(1); } /* main: register the interface, start listening for clients */ void __cdecl main(int argc, char * argv[]) { RPC_STATUS status; unsigned char * pszProtocolSequence = "ncacn_np"; unsigned char * pszSecurity = NULL; unsigned char * pszEndpoint = "\\pipe\\xmit"; unsigned int cMinCalls = 1; unsigned int cMaxCalls = 20; unsigned int fDontWait = FALSE; int i; /* allow the user to override settings with command line switches */ for (i = 1; i < argc; i++) { if ((*argv[i] == '-') || (*argv[i] == '/')) { switch (tolower(*(argv[i]+1))) { case 'p': // protocol sequence pszProtocolSequence = argv[++i]; break; case 'e': pszEndpoint = argv[++i]; break; case 'm': cMaxCalls = (unsigned int) atoi(argv[++i]); break; case 'n': cMinCalls = (unsigned int) atoi(argv[++i]); break; case 'f': fDontWait = (unsigned int) atoi(argv[++i]); break; case 'h': case '?': default: Usage(argv[0]); } } else Usage(argv[0]); } status = RpcServerUseProtseqEp(pszProtocolSequence, cMaxCalls, pszEndpoint, pszSecurity); // Security descriptor printf("RpcServerUseProtseqEp returned 0x%x\n", status); if (status) { exit(status); } status = RpcServerRegisterIf(xmit_ServerIfHandle, // interface to register NULL, // MgrTypeUuid NULL); // MgrEpv; null means use default printf("RpcServerRegisterIf returned 0x%x\n", status); if (status) { exit(status); } printf("Calling RpcServerListen\n"); status = RpcServerListen(cMinCalls, cMaxCalls, fDontWait); printf("RpcServerListen returned: 0x%x\n", status); if (status) { exit(status); } if (fDontWait) { printf("Calling RpcMgmtWaitServerListen\n"); status = RpcMgmtWaitServerListen(); // wait operation printf("RpcMgmtWaitServerListen returned: 0x%x\n", status); if (status) { exit(status); } } } // end main() /* end file xmits.c */