home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / netds / rpc / callback / calls.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-06-11  |  4.5 KB  |  141 lines

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