Primep.c
上传用户:bjlvip
上传日期:2010-02-08
资源大小:744k
文件大小:8k
源码类别:

Windows编程

开发平台:

Visual C++

  1. #include <STDIO.H>
  2. #include <WINDOWS.H>
  3. #include "Serverprime.h"
  4. #include "directio.h"
  5. /* If we found a prime then return PRIME, otherwise return NOT_PRIME */
  6. #define PRIME           1
  7. #define NOT_PRIME       0
  8. /* Maximum Number of Clients to respond to */
  9. #define MAX_CALLS      15
  10. /* Coordinates for displaying numbers to be tested */
  11. #define TESTING_X1      3
  12. #define TESTING_Y1      3
  13. #define TESTING_X2     23
  14. #define TESTING_Y2     18
  15. /* Coordinates for displaying prime numbers */
  16. #define PRIME_X1       30
  17. #define PRIME_Y1        3
  18. #define PRIME_X2       50
  19. #define PRIME_Y2       18
  20. #define ERROR_EXIT      2
  21. #define SUCCESS_EXIT    0
  22. #define STRING_LENGTH 256
  23. /* Time delay in microseconds */
  24. #define WAIT          350
  25. #define WAIT_DISPLAY 2000
  26. /* Colors used in this application */
  27. #define WHITE_ON_BLUE FOREGROUND_WHITE|FOREGROUND_INTENSITY|BACKGROUND_BLUE
  28. #define WHITE_ON_CYAN FOREGROUND_WHITE|FOREGROUND_INTENSITY|BACKGROUND_CYAN
  29. #define RED_ON_BLUE   FOREGROUND_RED|FOREGROUND_INTENSITY|BACKGROUND_BLUE
  30. #define RED_ON_CYAN   FOREGROUND_RED|FOREGROUND_INTENSITY|BACKGROUND_CYAN
  31. #define CYAN_ON_CYAN  FOREGROUND_CYAN|BACKGROUND_CYAN
  32. /* Number of characters in computer name to display on the screen */
  33. #define COMP_NAME_LENGTH 7
  34. extern CRITICAL_SECTION GlobalCriticalSection;
  35. unsigned long handles = 0, handlesp = 0;
  36. /* Critical Section for choosing next available number for testing */
  37. char GlobalComputerNameBuffer[MAX_CALLS][MAX_COMPUTERNAME_LENGTH];
  38. /* Number of primes for each client */
  39. unsigned long NoPrimes[MAX_CALLS];
  40. unsigned long GlobalComputerHandleBuffer[MAX_CALLS];
  41. unsigned long handle_mod = 1;
  42. /*
  43.    This function is called by the client, we return a unique number,
  44.    so in the future we can keep track who called us
  45. */
  46. unsigned long InitializePrimeServer(handle_t h1,
  47.    PPCONTEXT_HANDLE_TYPE pphContext,unsigned char *ComputerName)
  48.    {
  49.    char Buffer[STRING_LENGTH];
  50.    unsigned long unique_handle;
  51.    EnterCriticalSection(&GlobalCriticalSection);
  52.    unique_handle = handles + 10 * handle_mod++;
  53.    strcpy(GlobalComputerNameBuffer[handles], ComputerName);
  54.    mxyputc(2, 21, (char)32, 75, CYAN_ON_CYAN);
  55.    sprintf(Buffer, "Computer %s logged in.", ComputerName);
  56.    mxyputs(27, 21, Buffer, RED_ON_CYAN);
  57.    sprintf(Buffer,  "(%ld)",unique_handle);
  58.    mxyputs(54, 21, Buffer, RED_ON_CYAN);
  59.    Sleep(2*WAIT_DISPLAY);
  60.    mxyputc(2, 21, (char)32, 75, CYAN_ON_CYAN);
  61.    GlobalComputerHandleBuffer[handles] = unique_handle;
  62.    *pphContext = (PCONTEXT_HANDLE_TYPE)unique_handle;
  63.    NoPrimes[handles] = 0;
  64.    handles++;
  65.    handlesp = handles;
  66.    LeaveCriticalSection(&GlobalCriticalSection);
  67.    return unique_handle;
  68.    }
  69. /*
  70.    This function was called by the client. The client supplied his identifier
  71.    and the number to test if it is a prime
  72. */
  73. unsigned char RemoteIsPrime(handle_t h1, unsigned long PrimeServerHandle,
  74.    unsigned long TestNumber)
  75.    {
  76.    unsigned long count;
  77.    unsigned long HalfNumber = TestNumber / 2 + 1;
  78.    char Buffer[STRING_LENGTH];
  79.    char LocalComputerName[MAX_COMPUTERNAME_LENGTH];
  80.    int loop;
  81.    SMALL_RECT psrctScrollRectTesting, psrctScrollRectPrime;
  82.    COORD coordDestOriginTesting, coordDestOriginPrime;
  83.    CHAR_INFO pchiFill;
  84.    WORD Local[COMP_NAME_LENGTH];
  85.    COORD ComputTestCoord;
  86.    COORD ComputPrimeCoord;
  87.    DWORD dummy;
  88. /* Lets find out the name of client computer */
  89.    EnterCriticalSection(&GlobalCriticalSection);
  90.    for(loop = 0; loop < (int)handles; loop++)
  91.       if(GlobalComputerHandleBuffer[loop] == PrimeServerHandle)
  92.          {
  93.          strcpy(LocalComputerName, GlobalComputerNameBuffer[loop]);
  94.          PrimeServerHandle = loop;
  95.          break;
  96.          }
  97.    LeaveCriticalSection(&GlobalCriticalSection);
  98.    psrctScrollRectTesting.Left   = TESTING_X1+1;
  99.    psrctScrollRectTesting.Top    = TESTING_Y1+2;
  100.    psrctScrollRectTesting.Right  = TESTING_X2-1;
  101.    psrctScrollRectTesting.Bottom = TESTING_Y2-1;
  102.    coordDestOriginTesting.X = TESTING_X1+1;
  103.    coordDestOriginTesting.Y = TESTING_Y1+1;
  104.    psrctScrollRectPrime.Left   = PRIME_X1+1;
  105.    psrctScrollRectPrime.Top    = PRIME_Y1+2;
  106.    psrctScrollRectPrime.Right  = PRIME_X2-1;
  107.    psrctScrollRectPrime.Bottom = PRIME_Y2-1;
  108.    coordDestOriginPrime.X = PRIME_X1+1;
  109.    coordDestOriginPrime.Y = PRIME_Y1+1;
  110.    pchiFill.Char.AsciiChar = (char)32;
  111.    pchiFill.Attributes = WHITE_ON_BLUE;
  112.    ComputTestCoord.X  = TESTING_X2-7;
  113.    ComputTestCoord.Y  = TESTING_Y2-1;
  114.    ComputPrimeCoord.X = PRIME_X2-7;
  115.    ComputPrimeCoord.Y = PRIME_Y2-1;
  116.    for(loop = 0; loop < COMP_NAME_LENGTH; loop++)
  117.       Local[loop] = WHITE_ON_BLUE;
  118.    if(VK_ESCAPE == get_character_no_wait())
  119.       {
  120. /* If the user pressed ESC then exit */
  121.       EnterCriticalSection(&GlobalCriticalSection);
  122.       Sleep(WAIT);
  123.       clearscreen(0);
  124.       exit(SUCCESS_EXIT);
  125.       LeaveCriticalSection(&GlobalCriticalSection);
  126.       DeleteCriticalSection(&GlobalCriticalSection);
  127.       }
  128.    sprintf(Buffer, "%d", TestNumber);
  129.    EnterCriticalSection(&GlobalCriticalSection);
  130.    ScrollConsoleScreenBuffer(hStdOut, &psrctScrollRectTesting, NULL,
  131.       coordDestOriginTesting, &pchiFill);
  132.    sprintf(Buffer, "%d", TestNumber);
  133.    mxyputs((unsigned char)TESTING_X1+2, (unsigned char)(TESTING_Y2-1),
  134.       Buffer, WHITE_ON_BLUE);
  135.    WriteConsoleOutputAttribute(hStdOut, Local, COMP_NAME_LENGTH,
  136.       ComputTestCoord, &dummy);
  137.    LocalComputerName[COMP_NAME_LENGTH] = 0;
  138.    mxyputs((unsigned char)(TESTING_X2-7), (unsigned char)TESTING_Y2-1,
  139.       LocalComputerName, WHITE_ON_BLUE);
  140.    LeaveCriticalSection(&GlobalCriticalSection);
  141.    for(count = 2; count < HalfNumber; count++)
  142.       if(TestNumber % count == 0)
  143.          return NOT_PRIME;
  144.    sprintf(Buffer, "%d", TestNumber);
  145.    EnterCriticalSection(&GlobalCriticalSection);
  146.    ScrollConsoleScreenBuffer(hStdOut, &psrctScrollRectPrime, NULL,
  147.       coordDestOriginPrime, &pchiFill);
  148.    sprintf(Buffer, "%d", TestNumber);
  149.    mxyputs((unsigned char)(PRIME_X1+2), (unsigned char)PRIME_Y2-1, Buffer,
  150.       WHITE_ON_BLUE);
  151.    WriteConsoleOutputAttribute(hStdOut, Local, COMP_NAME_LENGTH,
  152.       ComputPrimeCoord, &dummy);
  153.    mxyputs((unsigned char)(PRIME_X2-7), (unsigned char)PRIME_Y2-1,
  154.       LocalComputerName, WHITE_ON_BLUE);
  155.    NoPrimes[PrimeServerHandle]++;
  156.    LeaveCriticalSection(&GlobalCriticalSection);
  157.    return PRIME;
  158.    }
  159. /* Notification from a client that he is done */
  160. void TerminatePrimeServer(handle_t h1, unsigned long PrimeServerHandle)
  161.    {
  162.    char Buffer[256+MAX_COMPUTERNAME_LENGTH];
  163.    unsigned char loop, loopshift;
  164.    EnterCriticalSection(&GlobalCriticalSection);
  165.    for(loop = 0; loop < (unsigned char)handles; loop++)
  166.       {
  167.       if(GlobalComputerHandleBuffer[loop] == PrimeServerHandle)
  168.          {
  169.          mxyputc(2, 21, (char)32, 75, CYAN_ON_CYAN);
  170. /* Let's put terminating message on the screen */
  171.          sprintf(Buffer, "Computer %s Exited!",
  172.             GlobalComputerNameBuffer[loop]);
  173.          mxyputs(27, 21, Buffer, RED_ON_CYAN);
  174.          mxyputc(59, (unsigned char)(4+loop), (char)32, 15, CYAN_ON_CYAN);
  175.          Sleep(WAIT_DISPLAY);
  176.          mxyputc(2, 21, (char)32, 75, CYAN_ON_CYAN);
  177.          break;
  178.          }
  179.       }
  180.    if(loop < handles-1)
  181.       {
  182.       loopshift = loop;
  183.       for(loop = loopshift; loop < (unsigned char)(handles - 1); loop++)
  184.          {
  185.          strcpy(GlobalComputerNameBuffer[loop],
  186.             GlobalComputerNameBuffer[loop+1]);
  187.          GlobalComputerHandleBuffer[loop] =
  188.             GlobalComputerHandleBuffer[loop+1];
  189.          NoPrimes[loop] = NoPrimes[loop+1];
  190.          }
  191.       }
  192. /* Let's remove his name from our table */
  193.    handles--;
  194.    LeaveCriticalSection(&GlobalCriticalSection);
  195.    }
  196. void __RPC_USER PCONTEXT_HANDLE_TYPE_rundown(PCONTEXT_HANDLE_TYPE phContext)
  197.    {
  198.    handle_t dummmy = 0;
  199.    if(handlesp == handles)
  200.       {
  201.       mxyputs(27, 2, "rundown Executed", RED_ON_CYAN);
  202.       TerminatePrimeServer(dummmy, (unsigned long)phContext);
  203.       Sleep(2000);
  204.       mxyputs(27, 2, "                ", CYAN_ON_CYAN);
  205.       }
  206.    handlesp = handles;
  207.    }