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

Windows编程

开发平台:

Visual C++

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