DUNIONS.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:4k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /****************************************************************************
  2.                    Microsoft RPC Version 2.0
  3.            Copyright Microsoft Corp. 1992, 1993, 1994- 1996
  4.                     Discriminated Union Example
  5.     FILE:       dunions.c
  6.     USAGE:      dunions  -p protocol_sequence
  7.                          -e endpoint
  8.                          -m max calls
  9.                          -n min calls
  10.                          -f flag for RpcServerListen
  11.     PURPOSE:    Server side of RPC distributed application dunion
  12.     FUNCTIONS:  main() - registers server as RPC server
  13.     COMMENTS:   This distributed application illustrates discriminated
  14.                 union.
  15. ****************************************************************************/
  16. #include <stdlib.h>
  17. #include <stdio.h>
  18. #include <ctype.h>
  19. #include "dunion.h"    // header file generated by MIDL compiler
  20. #define PURPOSE 
  21. "This Microsoft RPC Version 2.0 sample program demonstratesn
  22. two ways to specify a discriminated union. For more informationn
  23. about the attributes and the RPC API functions, see then
  24. RPC programming guide and reference.nn"
  25. void Usage(char * pszProgramName)
  26. {
  27.     fprintf(stderr, "%s", PURPOSE);
  28.     fprintf(stderr, "Usage:  %sn", pszProgramName);
  29.     fprintf(stderr, " -p protocol_sequencen");
  30.     fprintf(stderr, " -e endpointn");
  31.     fprintf(stderr, " -m maxcallsn");
  32.     fprintf(stderr, " -n mincallsn");
  33.     fprintf(stderr, " -f flag_wait_opn");
  34.     exit(1);
  35. }
  36. void _CRTAPI1 main(int argc, char * argv[])
  37. {
  38.     RPC_STATUS status;
  39.     unsigned char * pszProtocolSequence = "ncacn_np";
  40.     unsigned char * pszSecurity         = NULL;
  41.     unsigned char * pszEndpoint         = "\pipe\dunion";
  42.     unsigned int    cMinCalls           = 1;
  43.     unsigned int    cMaxCalls           = 20;
  44.     unsigned int    fDontWait           = FALSE;
  45.     int i;
  46.     /* allow the user to override settings with command line switches */
  47.     for (i = 1; i < argc; i++) {
  48.         if ((*argv[i] == '-') || (*argv[i] == '/')) {
  49.             switch (tolower(*(argv[i]+1))) {
  50.             case 'p':  // protocol sequence
  51.                 pszProtocolSequence = argv[++i];
  52.                 break;
  53.             case 'e':
  54.                 pszEndpoint = argv[++i];
  55.                 break;
  56.             case 'm':
  57.                 cMaxCalls = (unsigned int) atoi(argv[++i]);
  58.                 break;
  59.             case 'n':
  60.                 cMinCalls = (unsigned int) atoi(argv[++i]);
  61.                 break;
  62.             case 'f':
  63.                 fDontWait = (unsigned int) atoi(argv[++i]);
  64.                 break;
  65.             case 'h':
  66.             case '?':
  67.             default:
  68.                 Usage(argv[0]);
  69.             }
  70.         }
  71.         else
  72.             Usage(argv[0]);
  73.      }
  74.      status = RpcServerUseProtseqEp(pszProtocolSequence,
  75.                                     cMaxCalls,
  76.                                     pszEndpoint,
  77.                                     pszSecurity);  // Security descriptor
  78.      printf("RpcServerUseProtseqEp returned 0x%xn", status);
  79.      if (status) {
  80.          exit(status);
  81.      }
  82.      status = RpcServerRegisterIf(dunion_ServerIfHandle,// interface to register
  83.                                   NULL,   // MgrTypeUuid
  84.                                   NULL);  // MgrEpv; null means use default
  85.      printf("RpcServerRegisterIf returned 0x%xn", status);
  86.      if (status) {
  87.          exit(status);
  88.      }
  89.      printf("Calling RpcServerListenn");
  90.      status = RpcServerListen(cMinCalls,
  91.                               cMaxCalls,
  92.                               fDontWait);
  93.      printf("RpcServerListen returned: 0x%xn", status);
  94.      if (status) {
  95.          exit(status);
  96.      }
  97.      if (fDontWait) {
  98.          printf("Calling RpcMgmtWaitServerListenn");
  99.          status = RpcMgmtWaitServerListen();  //  wait operation
  100.          printf("RpcMgmtWaitServerListen returned: 0x%xn", status);
  101.          if (status) {
  102.              exit(status);
  103.          }
  104.      }
  105. }  // end main()
  106. /*********************************************************************/
  107. /*                 MIDL allocate and free                            */
  108. /*********************************************************************/
  109. void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
  110. {
  111.     return(malloc(len));
  112. }
  113. void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
  114. {
  115.     free(ptr);
  116. }
  117. /* end file dunions.c */