--- mstools/samples/rpc/mandel/server.c 2018/08/09 18:20:56 1.1.1.2 +++ mstools/samples/rpc/mandel/server.c 2018/08/09 18:22:00 1.1.1.3 @@ -6,10 +6,17 @@ // // File: mandel\server.c // +// +// Usage: server -p protocol_sequence +// -e endpoint +// -m max calls +// -n min calls +// -s security descriptor +// -f flag for RpcServerListen +// // Contents: Mandelbrot sample program // // Functions: main - register interface and listen for clients -// //-------------------------------------------------------------------------- */ @@ -24,34 +31,99 @@ HANDLE hSharedBuf = NULL; -void main(void) +void Usage(char * pszProgramName) +{ + 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"); + fprintf(stderr, " -s security_descriptor\n"); + exit(1); +} + +/* main: register the interface, start listening for clients */ +void _CRTAPI1 main(int argc, char * argv[]) { RPC_STATUS status; - char * pszEndpoint = "\\pipe\\mandel"; + unsigned char * pszProtocolSequence = "ncacn_np"; + unsigned char * pszSecurity = NULL; + unsigned char * pszEndpoint = "\\pipe\\mandel"; + 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 's': + pszSecurity = argv[++i]; + break; + case 'h': + case '?': + default: + Usage(argv[0]); + } + } + else + Usage(argv[0]); + } hSharedBuf = GlobalAlloc(GMEM_FIXED, MAX_BUFSIZE); -/* Select named pipes as the transport type and provide the */ -/* name of the named pipe that is used for RPC. */ - - status = RpcServerUseProtseqEp("ncacn_np", - 1, // maximum concurrent calls + status = RpcServerUseProtseqEp(pszProtocolSequence, + cMaxCalls, // max concurrent calls pszEndpoint, - 0); + pszSecurity); // Security descriptor printf("RpcServerUseProtseqEp returned 0x%x\n", status); if (status) { - exit(2); + exit(status); } - status = RpcServerRegisterIf(mdlrpc_ServerIfHandle, 0, 0); + status = RpcServerRegisterIf( + mdlrpc_ServerIfHandle, // interface to register + NULL, // MgrTypeUuid + NULL); // MgrEpv; null means use default printf("RpcServerRegisterIf returned 0x%x\n", status); if (status) { - exit(2); + exit(status); } + printf("Calling RpcServerListen\n"); + status = RpcServerListen(cMinCalls, + cMaxCalls, + fDontWait); + printf("RpcServerListen returned: 0x%x\n", status); + if (status) { + exit(status); + } - status = RpcServerListen(1, - 200); // a very large number + if (fDontWait) { + printf("Calling RpcMgmtWaitServerListen\n"); + status = RpcMgmtWaitServerListen(); // wait operation + printf("RpcMgmtWaitServerListen returned: 0x%x\n", status); + if (status) { + exit(status); + } + } } /* end main() */