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

Windows编程

开发平台:

Visual C++

  1. /****************************************************************************
  2.                    Microsoft RPC Version 2.0
  3.            Copyright Microsoft Corp. 1992, 1993, 1994- 1996
  4.                        xmit Example
  5.     FILE:       xmitc.c
  6.     USAGE:      xmitc  -n network_address
  7.                        -p protocol_sequence
  8.                        -e endpoint
  9.                        -o options
  10.                        -c count of elements in linked list
  11.                        -v value of first element in linked list
  12.                        -d delta between values in linked list
  13.     PURPOSE:    Client side of RPC distributed application.
  14.                 This sample demonstrates the transmit_as example.
  15.                 A doubly-linked list is transmitted over the network
  16.                 as a sized array.
  17.     RELATED:    xmits.c - server main
  18.                 xmitp.c - remote procedures
  19.                 xmitu.c - utility procedures
  20.     FUNCTIONS:  main() - bind to server and call remote procedure
  21.     COMMENTS:   This sample program generates a linked list to
  22.                 demonstrate how a list with aliasing can be transmitted
  23.                 using the transmit_as attribute as a sized array.
  24.                 The pointers are rebuilt on the server side.
  25.                 The [transmit_as] attribute (used in the typedef of
  26.                 DOUBLE_LINK_TYPE in the file XMIT.IDL) requires the
  27.                 four user-supplied functions whose names start with
  28.                 the name of the presented type, DOUBLE_LINK_TYPE.
  29.                 The [in, out] attributes applied to remote procedure
  30.                 parameters require the two user-supplied functions
  31.                 midl_user_allocate and midl_user_free.
  32.                 The other functions are utilities that are used to
  33.                 build or display the data structures.
  34. ****************************************************************************/
  35. #include <stdlib.h>
  36. #include <stdio.h>
  37. #include <ctype.h>
  38. #include "xmit.h"     // header file generated by MIDL compiler
  39. #include "xmitu.h"    // utility function prototypes
  40. #define PURPOSE 
  41. "This Microsoft RPC Version 2.0 sample program demonstratesn
  42. the use of the [transmit_as] attribute. For more informationn
  43. about the attributes and the RPC API functions, see then
  44. RPC programming guide and reference.nn"
  45. #define MAX_ELEMENTS 50
  46. void Usage(char * pszProgramName)
  47. {
  48.     fprintf(stderr, "%s", PURPOSE);
  49.     fprintf(stderr, "Usage:  %sn", pszProgramName);
  50.     fprintf(stderr, " -p protocol_sequencen");
  51.     fprintf(stderr, " -n network_addressn");
  52.     fprintf(stderr, " -e endpointn");
  53.     fprintf(stderr, " -o optionsn");
  54.     fprintf(stderr, " -c count_of_elementsn");
  55.     fprintf(stderr, " -v valuen");
  56.     fprintf(stderr, " -d deltan");
  57.     exit(1);
  58. }
  59. void _CRTAPI1 main(int argc, char **argv)
  60. {
  61.     RPC_STATUS status;
  62.     unsigned char * pszUuid             = NULL;
  63.     unsigned char * pszProtocolSequence = "ncacn_np";
  64.     unsigned char * pszNetworkAddress   = NULL;
  65.     unsigned char * pszEndpoint         = "\pipe\xmit";
  66.     unsigned char * pszOptions          = NULL;
  67.     unsigned char * pszStringBinding    = NULL;
  68.     int i;
  69.     int cElements = 10;
  70.     short sValue = 100;
  71.     short sDelta = 10;
  72.     DOUBLE_LINK_TYPE *pFirst, *pCurrent;
  73.     /* allow the user to override settings with command line switches */
  74.     for (i = 1; i < argc; i++) {
  75.         if ((*argv[i] == '-') || (*argv[i] == '/')) {
  76.             switch (tolower(*(argv[i]+1))) {
  77.             case 'p':  // protocol sequence
  78.                 pszProtocolSequence = argv[++i];
  79.                 break;
  80.             case 'n':  // network address
  81.                 pszNetworkAddress = argv[++i];
  82.                 break;
  83.             case 'e':
  84.                 pszEndpoint = argv[++i];
  85.                 break;
  86.             case 'o':
  87.                 pszOptions = argv[++i];
  88.                 break;
  89.             case 'c':
  90.                 cElements = atoi(argv[++i]);
  91.                 if (cElements > MAX_ELEMENTS)
  92.                     cElements = MAX_ELEMENTS;
  93.                 break;
  94.             case 'v':
  95.                 sValue = (short)atoi(argv[++i]);
  96.                 break;
  97.             case 'd':
  98.                 sDelta = (short)atoi(argv[++i]);
  99.                 break;
  100.             case 'h':
  101.             case '?':
  102.             default:
  103.                 Usage(argv[0]);
  104.             }
  105.         }
  106.         else
  107.             Usage(argv[0]);
  108.     }
  109.     /* initialize a list with a number of elements */
  110.     pFirst = InsertNewNode(sValue, NULL);
  111.     pCurrent = pFirst;   // assign some values to the list nodes
  112.     sValue += sDelta;    // make them different values
  113.     for (i = 1; i < cElements; i++) {
  114.         pCurrent = InsertNewNode(sValue, pCurrent);
  115.         sValue += sDelta;
  116.     }
  117.     ListWalkProc(pFirst);
  118.     /* Use a convenience function to concatenate the elements of the string */
  119.     /* binding into the syntax needed by RpcBindingFromStringBinding.       */
  120.     status = RpcStringBindingCompose(pszUuid,
  121.                                      pszProtocolSequence,
  122.                                      pszNetworkAddress,
  123.                                      pszEndpoint,
  124.                                      pszOptions,
  125.                                      &pszStringBinding);
  126.     printf("RpcStringBindingCompose returned 0x%xn", status);
  127.     printf("pszStringBinding = %sn", pszStringBinding);
  128.     if (status) {
  129.         exit(status);
  130.     }
  131.     /* Set the binding handle that will be used to bind to the server. */
  132.     status = RpcBindingFromStringBinding(pszStringBinding,
  133.                                          &hXmit);
  134.     printf("RpcBindingFromStringBinding returned 0x%xn", status);
  135.     if (status) {
  136.         exit(status);
  137.     }
  138.     RpcTryExcept {
  139.         printf("Calling the remote procedure 'ModifyListProc'n");
  140.         ModifyListProc(pFirst);  // call the remote procedure
  141.         printf("Calling the remote procedure 'Shutdown'n");
  142.         Shutdown();  // shut down the server side
  143.     }
  144.     RpcExcept(1) {
  145.         printf("Runtime reported exception %ldn", RpcExceptionCode() );
  146.     }
  147.     RpcEndExcept
  148.     printf("After ModifyListProc, the list appears as follows:n");
  149.     ListWalkProc(pFirst);  // call the utility that displays the list
  150.     /* The calls to the remote procedures are complete.            */
  151.     /* Free the string and the binding handle using RPC API calls. */
  152.     status = RpcStringFree(&pszStringBinding);
  153.     printf("RpcStringFree returned 0x%xn", status);
  154.     if (status) {
  155.         exit(status);
  156.     }
  157.     status = RpcBindingFree(&hXmit);
  158.     printf("RpcBindingFree returned 0x%xn", status);
  159.     if (status) {
  160.         exit(status);
  161.     }
  162.     exit(0);
  163. }  // end main()
  164. /* end file xmitc.c */