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

Windows编程

开发平台:

Visual C++

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