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

Windows编程

开发平台:

Visual C++

  1. /*************************************************************************
  2.                     Copyright Microsoft Corp. 1992-1996
  3.                         Remote Machine pipe sample
  4.   FILE      :   pipes.c
  5.   USAGE     :   server  -p protocol_sequence
  6.                         -e endpoint
  7.   PURPOSE   :   Server side of the RPC distributed application pipe.
  8.   
  9.   COMMENTS  :   This application uses the implicit binding method.
  10. *************************************************************************/
  11. #include "pipe.h"       // Generated by the MIDL compiler
  12. #include "common.h"     // Common definitions is locataed in  this file
  13. // Local Procedures 
  14. void CleanUpServer();   // Unregisters the interface
  15. /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  16. /*  Procedure   :   void Usage(_TUCHAR *)                               */
  17. /*  Desc        :   This procedure prints out an error message if the   */
  18. /*                  command line arguments are wrong                    */
  19. /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  20. void Usage(_TUCHAR * pszProgramName)
  21. {
  22.     _tprintf(TEXT("USAGE : %s [-option]n"), pszProgramName);
  23.     _tprintf(TEXT("Options : -p Protocol Sequencen"));  
  24.     _tprintf(TEXT("          -e Endpointn"));  
  25.     exit(EXECUTION_FAILED);
  26. }
  27. /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  28. /* The server main program                                              */
  29. /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  30. int _CRTAPI1 main(int argc, char *argv[])
  31. {
  32.     RPC_STATUS      nStatus;        // Error status returned
  33.     int             nNumArgs;       // Number of command line arguments
  34.     int             nIdx;           // Counter in loops
  35.     
  36.     // Variabels used for selecting the protocol and the endpoint
  37.     _TUCHAR *pszProtocolSequence    = PROTOCOL_SEQUENCE;
  38.     _TUCHAR *pszEndpoint            = END_POINT;
  39.     _TUCHAR *pszSecurity            = NULL;
  40. // Get a common handle on the command line arguments for both UNICODE
  41. // and ASCII
  42. #ifdef _UNICODE
  43.     LPWSTR *szArglist = CommandLineToArgvW(GetCommandLine(), &nNumArgs);
  44.     if (NULL == szArglist)
  45.     {
  46.         _tprintf(TEXT("SERVER.C : CommandLineToArgW failed"));
  47.         exit(EXECUTION_FAILED);
  48.     }
  49. #else
  50.     char **szArglist = argv;
  51.     nNumArgs = argc;
  52. #endif
  53.     /* Allow the user to override settings with commandline switches    */
  54.     for (nIdx = 1; nIdx < nNumArgs; nIdx++) 
  55.     {
  56.         if((_tcscmp(szArglist[nIdx], TEXT("-p")) == 0) || 
  57.            (_tcscmp(szArglist[nIdx], TEXT("-P")) == 0))
  58.         {
  59.             pszProtocolSequence = szArglist[++nIdx];
  60.         }
  61.         else if((_tcscmp(szArglist[nIdx], TEXT("-e")) == 0) || 
  62.                 (_tcscmp(szArglist[nIdx], TEXT("-e")) == 0))
  63.         {
  64.             pszEndpoint = szArglist[++nIdx];
  65.         }
  66.         else 
  67.         {
  68.             Usage(szArglist[0]);  
  69.         }
  70.     }
  71.     
  72.     
  73.     /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  74.     /* Register the interface with the RPC run-time library             */
  75.     /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  76.     _tprintf(TEXT("Registering the interfacen"));
  77.     nStatus = RpcServerRegisterIf(
  78.         pipe_sample_v1_0_s_ifspec,  // Interface specification
  79.         NULL,                       // UUID to associate with MgrEnv arg.
  80.         NULL);                      // Managers entry point vector. (None)
  81.     EXIT_IF_FAIL(nStatus, "RpcServerRegisterIf");
  82.     /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  83.     /* Select Protocal sequence : This sample uses namedpipes as the    */
  84.     /* default protocol. The RpcServerUseProtseqEp function tells the   */
  85.     /* RPC run-time library to use the specified protocol sequence      */
  86.     /* combined with the specified endpoint for receiving remote        */
  87.     /* procedure calls                                                  */
  88.     /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  89.     _tprintf(TEXT("Selecting the protocol sequence to use.t"%s"n"),
  90.             pszProtocolSequence);
  91.     nStatus = RpcServerUseProtseqEp(
  92.         pszProtocolSequence,            // String with the protocol in
  93.         RPC_C_PROTSEQ_MAX_REQS_DEFAULT, // Max number of calls
  94.         pszEndpoint,                    // Endpoint addres information
  95.         pszSecurity);                   // Security 
  96.     EXIT_IF_FAIL(nStatus, "RpcServerUseProtseqsEp");
  97.     /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  98.     /* Now start listening for remote procedure calls from the client   */
  99.     /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  100.     RpcTryExcept
  101.     {
  102.         _tprintf(TEXT("Listening for remote calls...n"));
  103.         nStatus = RpcServerListen(
  104.             1,                              // The minimum number of calls
  105.             RPC_C_LISTEN_MAX_CALLS_DEFAULT, // The maximum number of calls
  106.             FALSE);                         // Continue until stopped
  107.         EXIT_IF_FAIL(nStatus, "RpcServerListen");
  108.     }
  109.     RpcExcept(DO_EXCEPTION)
  110.     {
  111.         // Print out the exception code 
  112.         _tprintf(TEXT("Run-time exception %u in %s at line %dn"), 
  113.                 RpcExceptionCode(), TEXT(__FILE__), __LINE__);
  114.         exit(EXECUTION_FAILED);
  115.     }
  116.     RpcEndExcept
  117.     // If no exceptions occured, clean up the server and exit
  118.     CleanUpServer();
  119.     // Deallocate the memory used for the ARGLIST if using UNICODE
  120. #ifdef _UNICODE
  121.     if (NULL != szArglist)
  122.         free(szArglist);
  123. #endif
  124.     return (EXECUTION_OK);
  125. }
  126. /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  127. /* Procedure    : void CleanUpServer(RPC_BINDING_VECTOR);               */
  128. /* Desc.        : This procedure will unregister the interface          */
  129. /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  130. void CleanUpServer(void)
  131. {
  132.     RPC_STATUS nStatus;          // Error status returned from RPC calls 
  133.     /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  134.     /* Unregister the interface from the RPC run-time library           */
  135.     /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  136.     _tprintf(TEXT("Unregistering the Interface"));
  137.     nStatus = RpcServerUnregisterIf(
  138.         NULL, NULL, // Prevents server from receiving any new remote calls
  139.         FALSE);     // Wait until all the active calls are complete
  140.     EXIT_IF_FAIL(nStatus, "RpcServerUnRegisterIf");
  141. }
  142. /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  143. /* Procedure    :   midl_user_allocate() and midl_user_free()           */
  144. /* Desc.        :   These procedure are declared in the header file     */
  145. /*                  generated by the midl compiler. These procedures    */
  146. /*                  should be used for all memory allocation and        */
  147. /*                  deallocation.                                       */
  148. /*                  These procedures are also called by the stub code to*/
  149. /*                  allocate and free memory.                           */
  150. /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  151. void __RPC_FAR * __RPC_API midl_user_allocate(size_t len)
  152. {
  153.     return (malloc(len));
  154. }
  155. void __RPC_API midl_user_free(void __RPC_FAR * ptr)
  156. {
  157.     if(NULL != ptr)
  158.         free (ptr);
  159. }