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

Windows编程

开发平台:

Visual C++

  1. /****************************************************************************
  2.                    Microsoft RPC Version 2.0
  3.            Copyright Microsoft Corp. 1992, 1993, 1994- 1996
  4.                        Doctor Example
  5.     FILE:       doctorc.c
  6.     USAGE:      doctorc  -n network_address
  7.                          -p protocol_sequence
  8.                          -e endpoint
  9.                          -o options
  10.     PURPOSE:    Client side of RPC distributed application
  11.     FUNCTIONS:  main() - binds to server and calls remote procedure
  12.     COMMENTS:   This version of the distributed application prints
  13.                 strings from the Doctor server.  Doctor is an Eliza-like
  14.                 personal therapist program that works by simple
  15.                 pattern-matching.
  16. ****************************************************************************/
  17. #include <stdlib.h>
  18. #include <stdio.h>
  19. #include <string.h>
  20. #include <ctype.h>
  21. #include "doctor.h"    // header file generated by MIDL compiler
  22. #define PURPOSE 
  23. "This Microsoft RPC Version 2.0 sample program demonstratesn
  24. the use of the [string] and [size_is] attributes. For moren
  25. information about attributes and RPC API functions, see then
  26. RPC programming guide and reference.nn"
  27. #define GREETING 
  28. "The doctor is in.n
  29. I am at your service; just tell me anything that troublesn
  30. or concerns you. Please end your sentences with a period,n
  31. a question mark, or an exclamation point, and then pressn
  32. the RETURN or ENTER key.  When you are ready to quit ourn
  33. session, just enter "bye" and press RETURN or ENTER.nn
  34. What is your name? >"
  35. #define FAREWELL 
  36. "I hope I have been of some service to you.n
  37. Let's get together again some time.nn"
  38. void Usage(char * pszProgramName)
  39. {
  40.     fprintf(stderr, "%s", PURPOSE);
  41.     fprintf(stderr, "Usage:  %sn", pszProgramName);
  42.     fprintf(stderr, " -p protocol_sequencen");
  43.     fprintf(stderr, " -n network_addressn");
  44.     fprintf(stderr, " -e endpointn");
  45.     fprintf(stderr, " -o optionsn");
  46.     exit(1);
  47. }
  48. void _CRTAPI1 main(int argc, char **argv)
  49. {
  50.     RPC_STATUS status;                 // returned by RPC API function
  51.     unsigned char pszName[STRSIZE];    // patient name
  52.     unsigned char achIn[STRSIZE];      // patient input
  53.     unsigned char * pszUuid             = NULL;
  54.     unsigned char * pszProtocolSequence = "ncacn_np";
  55.     unsigned char * pszNetworkAddress   = NULL;
  56.     unsigned char * pszEndpoint         = "\pipe\doctor";
  57.     unsigned char * pszOptions          = NULL;
  58.     unsigned char * pszStringBinding    = NULL;
  59.     int i;
  60.     /* allow the user to override settings with command line switches */
  61.     for (i = 1; i < argc; i++) {
  62.         if ((*argv[i] == '-') || (*argv[i] == '/')) {
  63.             switch (tolower(*(argv[i]+1))) {
  64.             case 'p':  // protocol sequence
  65.                 pszProtocolSequence = argv[++i];
  66.                 break;
  67.             case 'n':  // network address
  68.                 pszNetworkAddress = argv[++i];
  69.                 break;
  70.             case 'e':
  71.                 pszEndpoint = argv[++i];
  72.                 break;
  73.             case 'o':
  74.                 pszOptions = 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.     /* Use a convenience function to concatenate the elements of  */
  86.     /* the string binding into the proper sequence.               */
  87.     status = RpcStringBindingCompose(pszUuid,
  88.                                      pszProtocolSequence,
  89.                                      pszNetworkAddress,
  90.                                      pszEndpoint,
  91.                                      pszOptions,
  92.                                      &pszStringBinding);
  93.     if (status) {
  94.         printf("RpcStringBindingCompose returned 0x%xn", status);
  95.         printf("pszStringBinding = %sn", pszStringBinding);
  96.         exit(status);
  97.     }
  98.     /* Set the binding handle that will be used to bind to the server. */
  99.     status = RpcBindingFromStringBinding(pszStringBinding,
  100.                                          &doctor_IfHandle);
  101.     if (status) {
  102.         printf("RpcBindingFromStringBinding returned 0x%xn", status);
  103.         exit(status);
  104.     }
  105.     /* RPC is now initialized.  Call remote procedures as if        */
  106.     /* they were local procedures.                                  */
  107.     /* The doctor program consists of patient statements and doctor */
  108.     /* responses.  The patient string is transmitted to the server, */
  109.     /* and all processing is performed on the server.               */
  110.     printf("%s", GREETING);
  111.     gets(pszName);
  112.     printf("n%s>", pszName);
  113.     while (gets(achIn)) {
  114.         if (strncmp(achIn, "bye", 3) == 0)  // end of session?
  115.             break;
  116.         RpcTryExcept {
  117.             Analyze(&achIn[0]);
  118.         }
  119.         RpcExcept(1) {
  120.             printf("Runtime reported exception %ldn", RpcExceptionCode() );
  121.             break;
  122.         }
  123.         RpcEndExcept
  124.         printf("%s%s>", achIn, pszName);    // no, continue
  125.     }
  126.     RpcTryExcept {
  127.         Shutdown();                             // yes, shutdown the server
  128.     }
  129.     RpcExcept(1) {
  130.         printf("Runtime reported exception %ldn", RpcExceptionCode() );
  131.     }
  132.     RpcEndExcept
  133.     /*  The calls to the remote procedure are complete.  */
  134.     /*  Free the binding handle.                         */
  135.     status = RpcBindingFree(&doctor_IfHandle);  // remote calls done; unbind
  136.     if (status) {
  137.        printf("RpcBindingFree returned 0x%xn", status);
  138.        exit(status);
  139.     }
  140.     printf("%s", FAREWELL);
  141.     exit(0);
  142. }  // end main()
  143. /*********************************************************************/
  144. /*                 MIDL allocate and free                            */
  145. /*********************************************************************/
  146. void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
  147. {
  148.     return(malloc(len));
  149. }
  150. void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
  151. {
  152.     free(ptr);
  153. }
  154. /* end file doctorc.c */