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

Windows编程

开发平台:

Visual C++

  1. /****************************************************************************
  2.                    Microsoft RPC Version 2.0
  3.            Copyright Microsoft Corp. 1992, 1993, 1994- 1996
  4.                         repas Example
  5.     FILE:       repass.c
  6.     USAGE:      repass -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 repas
  12.     FUNCTIONS:  main() - registers server as RPC server
  13.     COMMENTS:   This sample program generates a client and server can share
  14.                 an interface, but one side can use a different representation
  15.                 than the other.
  16.                 The client side in this example does all operations using
  17.                 character strings, and the server side does all operations
  18.                 using UNICODE strings.  Two procedures are provided, one
  19.                 defined with ASCII strings, one with UNICODE strings.
  20.                 The wire format reflects these definitions, yet the client
  21.                 and server see pure ASCII and pure UNICODE respectively.
  22.                 The [represent_as] attribute (used in the client and server
  23.                 side acf files) requires the four user-supplied functions
  24.                 whose names start with the name of the transmitted type
  25.                 (in the client side's case: WCHAR_STRING)
  26.                 The [in, out] attributes applied to remote procedure
  27.                 parameters require the two user-supplied functions
  28.                 midl_user_allocate and midl_user_free.
  29.                 The other functions are utilities that are used to
  30.                 build or display the data structures.
  31. ****************************************************************************/
  32. #include <stdlib.h>
  33. #include <stdio.h>
  34. #include <ctype.h>
  35. #include "repass.h"     // header file generated by MIDL compiler
  36. #define PURPOSE 
  37. "This Microsoft RPC Version 2.0 sample program demonstratesn
  38. the use of the [transmit_as] attribute. For more informationn
  39. about the attributes and the RPC API functions, see then
  40. RPC programming guide and reference.nn"
  41. void Usage(char * pszProgramName)
  42. {
  43.     fprintf(stderr, "%s", PURPOSE);
  44.     fprintf(stderr, "Usage:  %sn", pszProgramName);
  45.     fprintf(stderr, " -p protocol_sequencen");
  46.     fprintf(stderr, " -e endpointn");
  47.     fprintf(stderr, " -m maxcallsn");
  48.     fprintf(stderr, " -n mincallsn");
  49.     fprintf(stderr, " -f flag_wait_opn");
  50.     exit(1);
  51. }
  52. /* main:  register the interface, start listening for clients */
  53. void _CRTAPI1 main(int argc, char * argv[])
  54. {
  55.     RPC_STATUS status;
  56.     unsigned char * pszProtocolSequence = "ncacn_np";
  57.     unsigned char * pszSecurity         = NULL;
  58.     unsigned char * pszEndpoint         = "\pipe\repas";
  59.     unsigned int    cMinCalls           = 1;
  60.     unsigned int    cMaxCalls           = 20;
  61.     unsigned int    fDontWait           = FALSE;
  62.     int i;
  63.     /* allow the user to override settings with command line switches */
  64.     for (i = 1; i < argc; i++) {
  65.         if ((*argv[i] == '-') || (*argv[i] == '/')) {
  66.             switch (tolower(*(argv[i]+1))) {
  67.             case 'p':  // protocol sequence
  68.                 pszProtocolSequence = argv[++i];
  69.                 break;
  70.             case 'e':
  71.                 pszEndpoint = argv[++i];
  72.                 break;
  73.             case 'm':
  74.                 cMaxCalls = (unsigned int) atoi(argv[++i]);
  75.                 break;
  76.             case 'n':
  77.                 cMinCalls = (unsigned int) atoi(argv[++i]);
  78.                 break;
  79.             case 'f':
  80.                 fDontWait = (unsigned int) atoi(argv[++i]);
  81.                 break;
  82.             case 'h':
  83.             case '?':
  84.             default:
  85.                 Usage(argv[0]);
  86.             }
  87.         }
  88.         else
  89.             Usage(argv[0]);
  90.     }
  91.     status = RpcServerUseProtseqEp(pszProtocolSequence,
  92.                                    cMaxCalls,
  93.                                    pszEndpoint,
  94.                                    pszSecurity);  // Security descriptor
  95.     printf("RpcServerUseProtseqEp returned 0x%xn", status);
  96.     if (status) {
  97.         exit(status);
  98.     }
  99.     status = RpcServerRegisterIf(repas_ServerIfHandle,  // interface to register
  100.                                  NULL,   // MgrTypeUuid
  101.                                  NULL);  // MgrEpv; null means use default
  102.     printf("RpcServerRegisterIf returned 0x%xn", status);
  103.     if (status) {
  104.         exit(status);
  105.     }
  106.     printf("Calling RpcServerListenn");
  107.     status = RpcServerListen(cMinCalls,
  108.                              cMaxCalls,
  109.                              fDontWait);
  110.     printf("RpcServerListen returned: 0x%xn", status);
  111.     if (status) {
  112.         exit(status);
  113.     }
  114.     if (fDontWait) {
  115.         printf("Calling RpcMgmtWaitServerListenn");
  116.         status = RpcMgmtWaitServerListen();  //  wait operation
  117.         printf("RpcMgmtWaitServerListen returned: 0x%xn", status);
  118.         if (status) {
  119.             exit(status);
  120.         }
  121.     }
  122. }  // end main()
  123. /* end file repass.c */