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 / rpcssm / rpcssmc.c < prev    next >
C/C++ Source or Header  |  1996-06-11  |  7KB  |  245 lines

  1. /****************************************************************************
  2.                    Microsoft RPC Version 2.0
  3.            Copyright Microsoft Corp. 1992, 1993, 1994- 1996
  4.                       rpcssm Example
  5.  
  6.     FILE:       rpcssmc.c
  7.  
  8.     USAGE:      rpcssmc  -n network_address
  9.                          -p protocol_sequence
  10.                          -e endpoint
  11.                          -o options
  12.  
  13.     PURPOSE:    Client side of RPC distributed application
  14.  
  15.     FUNCTIONS:  main() - binds to server and calls remote procedure
  16.  
  17.     COMMENTS:   This distributed application uses the rpcssm package.
  18.  
  19. ****************************************************************************/
  20.  
  21. #include <stdlib.h>
  22. #include <stdio.h>
  23. #include "rpcssm.h"    // header file generated by MIDL compiler
  24.  
  25.  
  26. #define PURPOSE \
  27. "This Microsoft RPC Version 2.0 sample program demonstrates\n\
  28. the use of the [context_handle] attribute. For more information\n\
  29. about attributes and RPC API functions, see the RPC programming\n\
  30. guide and reference.\n\n"
  31.  
  32. void AllocateSmList( PBOX * ppBox, short sListSize );
  33. void AllocateList( PBOX * ppBox, short sListSize );
  34. void InitList( PBOX  pBox, long lStartValue );
  35. void FreeList( PBOX  pBox );
  36. void PrintList( PBOX pBox );
  37.  
  38.  
  39. void Usage(char * pszProgramName)
  40. {
  41.     fprintf(stderr, "%s", PURPOSE);
  42.     fprintf(stderr, "Usage:  %s\n", pszProgramName);
  43.     fprintf(stderr, " -p protocol_sequence\n");
  44.     fprintf(stderr, " -n network_address\n");
  45.     fprintf(stderr, " -e endpoint\n");
  46.     fprintf(stderr, " -o options\n");
  47.     exit(1);
  48. }
  49.  
  50. void _CRTAPI1 main(int argc, char **argv)
  51. {
  52.     RPC_STATUS status;
  53.     PBOX       pBox = NULL;
  54.  
  55.     unsigned char * pszUuid             = NULL;
  56.     unsigned char * pszProtocolSequence = "ncacn_np";
  57.     unsigned char * pszNetworkAddress   = NULL;
  58.     unsigned char * pszEndpoint         = "\\pipe\\rpcssm";
  59.     unsigned char * pszOptions          = NULL;
  60.     unsigned char * pszStringBinding    = NULL;
  61.     int i;
  62.  
  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 'n':  // network address
  71.                 pszNetworkAddress = argv[++i];
  72.                 break;
  73.             case 'e':
  74.                 pszEndpoint = argv[++i];
  75.                 break;
  76.             case 'o':
  77.                 pszOptions = argv[++i];
  78.                 break;
  79.             case 'h':
  80.             case '?':
  81.             default:
  82.                 Usage(argv[0]);
  83.             }
  84.         }
  85.         else
  86.             Usage(argv[0]);
  87.     }
  88.  
  89.     RpcTryExcept {
  90.  
  91.         /* Use a convenience function to concatenate the elements of  */
  92.         /* the string binding into the proper sequence.               */
  93.         status = RpcStringBindingCompose(pszUuid,
  94.                                          pszProtocolSequence,
  95.                                          pszNetworkAddress,
  96.                                          pszEndpoint,
  97.                                          pszOptions,
  98.                                          &pszStringBinding);
  99.         printf("RpcStringBindingCompose returned 0x%x\n", status);
  100.         printf("pszStringBinding = %s\n", pszStringBinding);
  101.         if (status) {
  102.             exit(status);
  103.         }
  104.  
  105.         /* Set the binding handle that will be used to bind to the server. */
  106.         status = RpcBindingFromStringBinding(pszStringBinding,
  107.                                              &hStarter);
  108.         printf("RpcBindingFromStringBinding returned 0x%x\n", status);
  109.         if (status) {
  110.             exit(status);
  111.         }
  112.  
  113.         /* Now a different case: a client stub is in an enabled environment */
  114.  
  115.         status = RpcSmEnableAllocate();
  116.         printf("RpcSmEnableAllocate returned 0x%x\n", status);
  117.         if (status) {
  118.             exit(status);
  119.         }
  120.  
  121.         pBox = NULL;
  122.         AllocateSmList( &pBox, 4 );
  123.         InitList( pBox, 0xabcd0000 );
  124.         PrintList( pBox );
  125.  
  126.         printf("Calling the remote procedure InOutList\n");
  127.         InOutList( &pBox );
  128.         PrintList( pBox );
  129.  
  130.         /* No need to free the memory allocated with RpcSmAllocate,
  131.            RpcSmDisableAllocate would free it.
  132.         */
  133.  
  134.         status = RpcSmDisableAllocate();
  135.         printf("RpcSmDisableAllocate returned 0x%x\n", status);
  136.         if (status) {
  137.             exit(status);
  138.         }
  139.  
  140.         printf(" All nodes from this case freed by RpcSmDisableAllocate().\n" );
  141.         printf(" Client with memory environment done.\n\n" );
  142.  
  143.         Shutdown();
  144.  
  145.         /*  Free the string binding */
  146.         status = RpcStringFree(&pszStringBinding);
  147.         printf("RpcStringFree returned 0x%x\n", status);
  148.         if (status) {
  149.             exit(status);
  150.         }
  151.  
  152.         status = RpcBindingFree(&hStarter);
  153.         printf("RpcBindingFree returned 0x%x\n", status);
  154.         if (status) {
  155.             exit(status);
  156.         }
  157.     }
  158.     RpcExcept(1) {
  159.  
  160.         #if defined(WIN32)
  161.             printf( "Unexpected exception: %ld\n", RpcExceptionCode() );
  162.         #else
  163.             printf( "Unexpected exception: %d\n", RpcExceptionCode() );
  164.         #endif
  165.         printf("Did you set a net address (like -n server_name etc.)?\n");
  166.         exit(1);
  167.     }
  168.     RpcEndExcept;
  169.  
  170.     exit(0);
  171.  
  172. }  // end main()
  173.  
  174.  
  175. //=====================================================================
  176. //        List allocation/deallocation routines
  177. //=====================================================================
  178.  
  179. void
  180. AllocateSmList( PBOX * ppBox, short sListSize)
  181. {
  182.     PBOX    pBox, head;
  183.     int     i = 0;
  184.  
  185.     //.. Allocate a list of boxes, if needed  (when *ppBox==NULL).
  186.  
  187.     if ( *ppBox == NULL ) {
  188.  
  189.         RPC_STATUS status;
  190.  
  191.         head = 0;
  192.         for (i = 0; i < sListSize; i++)
  193.         {
  194.             pBox = (PBOX) RpcSmAllocate( sizeof(LBOX), &status);
  195.             if ( status != RPC_S_OK )
  196.             {
  197.                 printf("AllocateList FAILED: not enough memory\n");
  198.                 break;
  199.             }
  200.             pBox->next = head;
  201.             head = pBox;
  202.         }
  203.         *ppBox = head;
  204.     }
  205.     printf("%d nodes allocated.\n", i);
  206. }
  207.  
  208. //=====================================================================
  209. //        Initialization and pprint routines
  210. //=====================================================================
  211.  
  212. void  InitList( PBOX  pBox, long lStartValue )
  213. {
  214.     int i = 0;
  215.  
  216.     while( pBox ) {
  217.         pBox->data = lStartValue + ++i;
  218.         pBox = pBox->next;
  219.     }
  220.     printf("%d nodes inited.\n", i);
  221. }
  222.  
  223. // --------------------------------------------------------------------
  224.  
  225. void
  226. PrintList( PBOX  pBox )
  227. {
  228.     int i = 0;
  229.  
  230.  
  231.     while( pBox ) {
  232.  
  233.         if ( (i % 4) != 0 )
  234.             printf("  data[%d]= %lx", i, pBox->data);
  235.         else
  236.             printf( "\n  data[%d]= %lx", i, pBox->data);
  237.         pBox = pBox->next;
  238.         i++;
  239.     }
  240.     printf("\n" );
  241. }
  242.  
  243.  
  244. /* end rpcssmc.c */
  245.