YIELDS.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.                       yield Example
  5.     FILE:   yields.c
  6.     USAGE:  yields  -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 yield
  12.     FUNCTIONS:  main() - registers server as RPC server
  13.     COMMENTS:   This sample program generates a linked list to
  14.                 demonstrate how the list can be transmitted over
  15.                 the network more efficiently as a sized array.
  16.                 The pointers are rebuilt on the server side.
  17.                 The [transmit_as] attribute (used in the typedef of
  18.                 DOUBLE_LINK_TYPE in the file yield.IDL) requires the
  19.                 four user-supplied functions whose names start with
  20.                 the name of the presented type, DOUBLE_LINK_TYPE.
  21.                 The [in, out] attributes applied to remote procedure
  22.                 parameters require the two user-supplied functions
  23.                 midl_user_allocate and midl_user_free.
  24.                 The other functions are utilities that are used to
  25.                 build or display the data structures.
  26. ****************************************************************************/
  27. #include <stdlib.h>
  28. #include <stdio.h>
  29. #include <ctype.h>
  30. #include "yield.h"    // header file generated by MIDL compiler
  31. #define PURPOSE 
  32. "This Microsoft RPC Version 2.0 sample program demonstratesn
  33. the use of the [string] attribute. For more informationn
  34. about the attributes and the RPC API functions, see then
  35. RPC programming guide and reference.nn"
  36. void Usage(char * pszProgramName)
  37. {
  38.     fprintf(stderr, "%s", PURPOSE);
  39.     fprintf(stderr, "Usage:  %sn", pszProgramName);
  40.     fprintf(stderr, " -p protocol_sequencen");
  41.     fprintf(stderr, " -e endpointn");
  42.     fprintf(stderr, " -m maxcallsn");
  43.     fprintf(stderr, " -n mincallsn");
  44.     fprintf(stderr, " -f flag_wait_opn");
  45.     exit(1);
  46. }
  47. void _CRTAPI1 main(int argc, char * argv[])
  48. {
  49.     RPC_STATUS status;
  50.     unsigned char * pszProtocolSequence = "ncacn_np";
  51.     unsigned char * pszSecurity     = NULL;
  52.     unsigned char * pszEndpoint     = "\pipe\yield";
  53.     unsigned int    cMinCalls       = 1;
  54.     unsigned int    cMaxCalls       = 20;
  55.     unsigned int    fDontWait       = FALSE;
  56.     int i;
  57.     // allow the user to override settings with command line switches
  58.     for (i = 1; i < argc; i++) {
  59.         if ((*argv[i] == '-') || (*argv[i] == '/')) {
  60.             switch (tolower(*(argv[i]+1))) {
  61.             case 'p':  // protocol sequence
  62.                 pszProtocolSequence = argv[++i];
  63.                 break;
  64.             case 'e':
  65.                 pszEndpoint = argv[++i];
  66.                 break;
  67.             case 'm':
  68.                 cMaxCalls = (unsigned int) atoi(argv[++i]);
  69.                 break;
  70.             case 'n':
  71.                 cMinCalls = (unsigned int) atoi(argv[++i]);
  72.                 break;
  73.             case 'f':
  74.                 fDontWait = (unsigned int) atoi(argv[++i]);
  75.                 break;
  76.             case 'h':
  77.             case '?':
  78.             default:
  79.                 Usage(argv[0]);
  80.             }
  81.         }
  82.         else
  83.             Usage(argv[0]);
  84.     }
  85.     status = RpcServerUseProtseqEp(pszProtocolSequence,
  86.                                    cMaxCalls,
  87.                                    pszEndpoint,
  88.                                    pszSecurity);  // Security descriptor
  89.     printf("RpcServerUseProtseqEp returned 0x%xn", status);
  90.     if (status) {
  91.         exit(status);
  92.     }
  93.     status = RpcServerRegisterIf(yield_ServerIfHandle, // interface to register
  94.                                  NULL,   // MgrTypeUuid
  95.                                  NULL);  // MgrEpv; null means use default
  96.     printf("RpcServerRegisterIf returned 0x%xn", status);
  97.     if (status) {
  98.         exit(status);
  99.     }
  100.     printf("Calling RpcServerListenn");
  101.     status = RpcServerListen(cMinCalls,
  102.                              cMaxCalls,
  103.                              fDontWait);
  104.     printf("RpcServerListen returned: 0x%xn", status);
  105.     if (status) {
  106.         exit(status);
  107.     }
  108.     if (fDontWait) {
  109.         printf("Calling RpcMgmtWaitServerListenn");
  110.         status = RpcMgmtWaitServerListen();  //  wait operation
  111.         printf("RpcMgmtWaitServerListen returned: 0x%xn", status);
  112.         if (status) {
  113.             exit(status);
  114.         }
  115.     }
  116. } /* end main() */
  117. // ====================================================================
  118. //                MIDL allocate and free
  119. // ====================================================================
  120. void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
  121. {
  122.     return(malloc(len));
  123. }
  124. void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
  125. {
  126.     free(ptr);
  127. }
  128. /* end yields.c */