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

Windows编程

开发平台:

Visual C++

  1. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  2. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  3. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  4. // PARTICULAR PURPOSE.
  5. //
  6. // Copyright (C) 1995-1997  Microsoft Corporation.  All Rights Reserved.
  7. //
  8. //  MODULE:   client.c
  9. //
  10. //  PURPOSE:  This program is a command line oriented
  11. //            demonstration of the Simple RPC service sample.
  12. //
  13. //  FUNCTIONS:
  14. //    main(int argc, char **argv);
  15. //    StartTime()
  16. //    EndTime();
  17. //    DoTimings();
  18. //
  19. //  COMMENTS:
  20. //
  21. //  AUTHOR:
  22. //      Mario Goertzel - RPC Development
  23. //
  24. #include <windows.h>
  25. #include <stdio.h>
  26. #include <stdlib.h>
  27. #include <rpc.h>
  28. #include "rpcsvc.h"
  29. void Usage(void)
  30. {
  31.     printf("Usage:n"
  32.         "t-n <server addr>  - Defaults to local machinen"
  33.         "t-t <protseq>      - Defaults to ncalrpc (fast, local only)n"
  34.         "t-i <iterations>   - Defaults to 100n"
  35.         "t-s <security lvl> - Default none, range none (1) to privacy (6)n"
  36.         );
  37.     return;
  38. }
  39. //
  40. //  FUNCTIONS: StartTime()
  41. //             EndTime()
  42. //
  43. //  USAGE:
  44. //      StartTime();
  45. //        // Do some work.
  46. //      mseconds = EndTime();
  47. //
  48. //  RETURN VALUE:
  49. //      Milliseconds between StartTime() and EndTime() calls.
  50. LARGE_INTEGER Time;
  51. void StartTime(void)
  52. {
  53.     QueryPerformanceCounter(&Time);
  54. }
  55. ULONG EndTime()
  56. {
  57.     LARGE_INTEGER liDiff;
  58.     LARGE_INTEGER liFreq;
  59.     QueryPerformanceCounter(&liDiff);
  60.     liDiff.QuadPart -= Time.QuadPart;
  61.     liDiff.QuadPart *= 1000; // Adjust to milliseconds, shouldn't overflow...
  62.     (void)QueryPerformanceFrequency(&liFreq);
  63.     return ((ULONG)(liDiff.QuadPart / liFreq.QuadPart));
  64. }
  65. //
  66. //  FUNCTION: DoTimings
  67. //
  68. //  PURPOSE: Calls and times various RPC calls.
  69. //           (Avoid cluttering up main())
  70. //
  71. //  PARAMETERS:
  72. //    Binding     - Binding to the server.
  73. //    iIterations - Number of times to make each call.
  74. //
  75. //  RETURN VALUE:
  76. //    n/a
  77. //
  78. //
  79. void DoTimings(RPC_BINDING_HANDLE Binding,
  80.                UINT iIterations)
  81. {
  82.     ULONG mseconds;
  83.     UINT i;
  84.     RPC_STATUS status;
  85.     byte bBuffer[4096];
  86.     ULONG lBufferLength;
  87.     ULONG lBufferSize;
  88.     // Time Pings() (void calls)
  89.     StartTime();
  90.     for(i = iIterations; i; i--)
  91.         {
  92.         status = Ping(Binding);
  93.         if (status != RPC_S_OK)
  94.             goto Cleanup;
  95.         }
  96.     mseconds = EndTime();
  97.     printf("%4d calls in %8d milliseconds - void calls.n", iIterations, mseconds);
  98.     // Time [in] buffer's
  99.     //
  100.     lBufferLength = BUFFER_SIZE;
  101.     lBufferSize   = BUFFER_SIZE;
  102.     StartTime();
  103.     for(i = iIterations; i; i--)
  104.         {
  105.         status = BufferIn1(Binding, bBuffer, lBufferLength, lBufferSize);
  106.         if (status != RPC_S_OK)
  107.             {
  108.             goto Cleanup;
  109.             }
  110.         }
  111.     mseconds = EndTime();
  112.     printf("%4d calls in %8d milliseconds - 100 byte buffer in (1).n", iIterations, mseconds);
  113.     lBufferLength = BUFFER_SIZE;
  114.     StartTime();
  115.     for(i = iIterations; i; i--)
  116.         {
  117.         status = BufferIn3(Binding, bBuffer, lBufferLength);
  118.         if (status != RPC_S_OK)
  119.             {
  120.             goto Cleanup;
  121.             }
  122.         }
  123.     mseconds = EndTime();
  124.     printf("%4d calls in %8d milliseconds - 100 byte buffer in (2).n", iIterations, mseconds);
  125.     lBufferLength = BUFFER_SIZE;
  126.     StartTime();
  127.     for(i = iIterations; i; i--)
  128.         {
  129.         status = BufferIn3(Binding, bBuffer, lBufferLength);
  130.         if (status != RPC_S_OK)
  131.             {
  132.             goto Cleanup;
  133.             }
  134.         }
  135.     mseconds = EndTime();
  136.     printf("%4d calls in %8d milliseconds - 100 byte buffer in (3).n", iIterations, mseconds);
  137.     // Time [out] buffer's
  138.     lBufferLength = BUFFER_SIZE;
  139.     StartTime();
  140.     for(i = iIterations; i; i--)
  141.         {
  142.         status = BufferOut1(Binding, bBuffer, &lBufferLength);
  143.         if (status != RPC_S_OK)
  144.             {
  145.             goto Cleanup;
  146.             }
  147.         }
  148.     mseconds = EndTime();
  149.     printf("%4d calls in %8d milliseconds - 100 byte buffer out (1).n", iIterations, mseconds);
  150.     lBufferLength = BUFFER_SIZE;
  151.     lBufferSize   = BUFFER_SIZE;
  152.     StartTime();
  153.     for(i = iIterations; i; i--)
  154.         {
  155.         status = BufferOut2(Binding, bBuffer, lBufferSize, &lBufferLength);
  156.         if (status != RPC_S_OK)
  157.             {
  158.             goto Cleanup;
  159.             }
  160.         }
  161.     mseconds = EndTime();
  162.     printf("%4d calls in %8d milliseconds - 100 byte buffer out (2).n", iIterations, mseconds);
  163.     StartTime();
  164.     for(i = iIterations; i; i--)
  165.         {
  166.         BUFFER Buffer;
  167.         Buffer.BufferLength = 0;
  168.         Buffer.Buffer = 0;
  169.         status = BufferOut3(Binding, &Buffer);
  170.         if (status != RPC_S_OK)
  171.             {
  172.             goto Cleanup;
  173.             }
  174.         MIDL_user_free(Buffer.Buffer);
  175.         }
  176.     mseconds = EndTime();
  177.     printf("%4d calls in %8d milliseconds - 100 byte buffer out (3).n", iIterations, mseconds);
  178.     lBufferLength = BUFFER_SIZE;
  179.     StartTime();
  180.     for(i = iIterations; i; i--)
  181.         {
  182.         status = BufferOut4(Binding, bBuffer, &lBufferLength);
  183.         if (status != RPC_S_OK)
  184.             {
  185.             goto Cleanup;
  186.             }
  187.         }
  188.     mseconds = EndTime();
  189.     printf("%4d calls in %8d milliseconds - 100 byte buffer out (4).n", iIterations, mseconds);
  190.     // Time arrays of structures
  191.     {
  192.     struct BAD1 abad1[50];
  193.     struct BAD2 abad2[50];
  194.     struct GOOD agood[50];
  195.     for (i = 0; i < 50; i++)
  196.         {
  197.         abad2[i].e = (BAD_ENUM)i % 4 + 1;
  198.         agood[i].e = (GOOD_ENUM)i % 4 + 5;
  199.         }
  200.     StartTime();
  201.     for(i = iIterations; i; i--)
  202.         {
  203.         status = StructsIn1(Binding, &abad1[0]);
  204.         if (status != RPC_S_OK)
  205.             {
  206.             goto Cleanup;
  207.             }
  208.         }
  209.     mseconds = EndTime();
  210.     printf("%4d calls in %8d milliseconds - 2 mod 4 aligned structs.n", iIterations, mseconds);
  211.     StartTime();
  212.     for(i = iIterations; i; i--)
  213.         {
  214.         status = StructsIn2(Binding, &abad2[0]);
  215.         if (status != RPC_S_OK)
  216.             {
  217.             goto Cleanup;
  218.             }
  219.         }
  220.     mseconds = EndTime();
  221.     printf("%4d calls in %8d milliseconds - structs with an enum.n", iIterations, mseconds);
  222.     StartTime();
  223.     for(i = iIterations; i; i--)
  224.         {
  225.         status = StructsIn3(Binding, &agood[0]);
  226.         if (status != RPC_S_OK)
  227.             {
  228.             goto Cleanup;
  229.             }
  230.         }
  231.     mseconds = EndTime();
  232.     printf("%4d calls in %8d milliseconds - structs with v1_enum.n", iIterations, mseconds);
  233.     }
  234.     // Linked lists
  235.     {
  236.     LIST list;
  237.     PLIST plist = &list;
  238.     for (i = 0; i < LIST_SIZE - 1; i++)
  239.         {
  240.         plist->pNext = MIDL_user_allocate(sizeof(LIST));
  241.         plist->data = i;
  242.         if (plist->pNext == 0)
  243.             {
  244.             status = RPC_S_OUT_OF_MEMORY;
  245.             goto Cleanup;
  246.             }
  247.         plist = plist->pNext;
  248.         }
  249.     plist->data = i;
  250.     plist->pNext = 0;
  251.     
  252.     StartTime();
  253.     for(i = iIterations; i; i--)
  254.         {
  255.         status = ListIn(Binding, &list);
  256.         if (status != RPC_S_OK)
  257.             {
  258.             goto Cleanup;
  259.             }
  260.         }
  261.     mseconds = EndTime();
  262.     printf("%4d calls in %8d milliseconds - [in] linked list.n", iIterations, mseconds);
  263.     StartTime();
  264.     for(i = iIterations; i; i--)
  265.         {
  266.         status = ListOut1(Binding, &list);
  267.         if (status != RPC_S_OK)
  268.             {
  269.             goto Cleanup;
  270.             }
  271.         // Freeing the list here would cause all the elements
  272.         // to be allocated again on the next call.
  273.         }
  274.     mseconds = EndTime();
  275.     printf("%4d calls in %8d milliseconds - [out] linked list (1).n", iIterations, mseconds);
  276.     StartTime();
  277.     for(i = iIterations; i; i--)
  278.         {
  279.         status = ListOut2(Binding, &list);
  280.         if (status != RPC_S_OK)
  281.             {
  282.             goto Cleanup;
  283.             }
  284.         // Freeing the list here would cause all the elements
  285.         // to be allocated again on the next call.
  286.         }
  287.     mseconds = EndTime();
  288.     printf("%4d calls in %8d milliseconds - [out] linked list (2).n", iIterations, mseconds);
  289.     // Free allocated elements of the list.
  290.     plist = list.pNext;
  291.     while(plist)
  292.         {
  293.         PLIST tmp = plist;
  294.         plist = plist->pNext;
  295.         MIDL_user_free(tmp);
  296.         }
  297.     }
  298.     // Unions
  299.     {
  300.     BAD_UNION badunionArray[UNION_ARRAY_LEN];
  301.     GOOD_UNION goodunion;
  302.     ARM_ONE armone;
  303.     ULONG ulArray[UNION_ARRAY_LEN];
  304.     goodunion.Tag = 1;
  305.     goodunion.u.pOne = &armone;
  306.     armone.DataLength = UNION_ARRAY_LEN;
  307.     armone.Data = ulArray;
  308.     for(i = 0; i < UNION_ARRAY_LEN; i++)
  309.         {
  310.         ulArray[i] = i;
  311.         badunionArray[i].Tag = 1;
  312.         badunionArray[i].u.ulData = i;
  313.         }
  314.     StartTime();
  315.     for(i = iIterations; i; i--)
  316.         {
  317.         status = UnionCall1(Binding, UNION_ARRAY_LEN, badunionArray);
  318.         if (status != RPC_S_OK)
  319.             {
  320.             goto Cleanup;
  321.             }
  322.         }
  323.     mseconds = EndTime();
  324.     printf("%4d calls in %8d milliseconds - [in] array of unions.n", iIterations, mseconds);
  325.     StartTime();
  326.     for(i = iIterations; i; i--)
  327.         {
  328.         status = UnionCall2(Binding, &goodunion);
  329.         if (status != RPC_S_OK)
  330.             {
  331.             goto Cleanup;
  332.             }
  333.         }
  334.     mseconds = EndTime();
  335.     printf("%4d calls in %8d milliseconds - [in] union of arrays.n", iIterations, mseconds);
  336.     }
  337.     // Time pings() (null calls) which impersonate the client.
  338.     StartTime();
  339.     for(i = iIterations; i; i--)
  340.         {
  341.         status = CheckSecurity(Binding);
  342.         if (status != RPC_S_OK)
  343.             {
  344.             if (status == RPC_S_ACCESS_DENIED)
  345.                 {
  346.                 printf("Access denied, try -s 2 or higher.n");
  347.                 return;
  348.                 }
  349.             goto Cleanup;
  350.             }
  351.         }
  352.     mseconds = EndTime();
  353.     printf("%4d calls in %8d milliseconds - void call w/ impersonationn", iIterations, mseconds);
  354. Cleanup:
  355.     if (status != RPC_S_OK)
  356.         {
  357.         printf("Call failed - %dn", status);
  358.         }
  359.     return;
  360. }
  361. //
  362. //  FUNCTION: main
  363. //
  364. //  PURPOSE: Parses arguments and binds to the server.
  365. //
  366. //  PARAMETERS:
  367. //    argc - number of command line arguments
  368. //    argv - array of command line arguments
  369. //
  370. //  RETURN VALUE:
  371. //    Program exit code.
  372. //
  373. //
  374. int main(int argc, char *argv[])
  375. {
  376.     char *serverAddress = NULL;
  377.     char *protocol = "ncalrpc";
  378.     UINT iIterations = 100;
  379.     unsigned char *stringBinding;
  380.     RPC_BINDING_HANDLE Binding;
  381.     RPC_STATUS status;
  382.     ULONG SecurityLevel = RPC_C_AUTHN_LEVEL_NONE;
  383.     argc--;
  384.     argv++;
  385.     while(argc)
  386.         {
  387.         if (   argv[0][0] != '-'
  388.             && argv[0][0] != '/')
  389.             {
  390.             Usage();
  391.             return(1);
  392.             }
  393.         switch(argv[0][1])
  394.             {
  395.             case 'n':
  396.                 if (argc < 2)
  397.                     {
  398.                     Usage();
  399.                     return(1);
  400.                     }
  401.                 serverAddress = argv[1];
  402.                 argc--;
  403.                 argv++;
  404.                 break;
  405.             case 't':
  406.                 if (argc < 2)
  407.                     {
  408.                     Usage();
  409.                     return(1);
  410.                     }
  411.                 protocol = argv[1];
  412.                 argc--;
  413.                 argv++;
  414.                 break;
  415.             case 'i':
  416.                 if (argc < 2)
  417.                     {
  418.                     Usage();
  419.                     return(1);
  420.                     }
  421.                 iIterations = atoi(argv[1]);
  422.                 argc--;
  423.                 argv++;
  424.                 break;
  425.             case 's':
  426.                 if (argc < 2)
  427.                     {
  428.                     Usage();
  429.                     return(1);
  430.                     }
  431.                 SecurityLevel = atoi(argv[1]);
  432.                 if (SecurityLevel > RPC_C_AUTHN_LEVEL_PKT_PRIVACY)
  433.                     {
  434.                     Usage();
  435.                     return(1);
  436.                     }
  437.                 argc--;
  438.                 argv++;
  439.                 break;
  440.             default:
  441.                 Usage();
  442.                 return(1);
  443.                 break;
  444.             }
  445.         argc--;
  446.         argv++;
  447.         }
  448.     status = RpcStringBindingCompose(0,
  449.                                      protocol,
  450.                                      serverAddress,
  451.                                      0,
  452.                                      0,
  453.                                      &stringBinding);
  454.     if (status != RPC_S_OK)
  455.         {
  456.         printf("RpcStringBindingCompose failed - %dn", status);
  457.         return(1);
  458.         }
  459.     status = RpcBindingFromStringBinding(stringBinding, &Binding);
  460.     if (status != RPC_S_OK)
  461.         {
  462.         printf("RpcBindingFromStringBinding failed - %dn", status);
  463.         return(1);
  464.         }
  465.     status =
  466.     RpcBindingSetAuthInfo(Binding,
  467.                           0,
  468.                           SecurityLevel,
  469.                           RPC_C_AUTHN_WINNT,
  470.                           0,
  471.                           0
  472.                          );
  473.     if (status != RPC_S_OK)
  474.         {
  475.         printf("RpcBindingSetAuthInfo failed - %dn", status);
  476.         return(1);
  477.         }
  478.     status = Ping(Binding);
  479.     if (status != RPC_S_OK)
  480.         {
  481.         printf("Ping failed - %dn", status);
  482.         }
  483.     printf("Connected.n");
  484.     //
  485.     // Call and time various RPC calls.
  486.     //
  487.     DoTimings(Binding, iIterations);
  488.     // Cleanup
  489.     status = RpcBindingFree(&Binding);
  490.     // ASSERT(status == RPC_S_OK):
  491.     status = RpcStringFree(&stringBinding);
  492.     // ASSERT(status == RPC_S_OK);
  493.     return(0);
  494. }
  495. void * __RPC_USER MIDL_user_allocate(size_t size)
  496. {
  497.     return(HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS, size));
  498. }
  499. void __RPC_USER MIDL_user_free( void *pointer)
  500. {
  501.     HeapFree(GetProcessHeap(), 0, pointer);
  502. }