home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 31 / CDASC_31_1996_juillet_aout.iso / vrac / cuj0796.zip / HEYMAN.ZIP / SERVER.CPP < prev   
C/C++ Source or Header  |  1996-05-08  |  4KB  |  205 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <process.h>
  4.  
  5. #include "nmpipe.h"
  6.  
  7. class srv_cPipeServer;
  8.  
  9. // server worker thread handling class
  10. class srv_cThread {
  11. private:
  12.     HANDLE           hEventShutdown;
  13.     nmpipe_cListener Listener;
  14.  
  15. public:
  16.     srv_cThread(const char *, HANDLE, DWORD);
  17.     ~srv_cThread();
  18.  
  19.     void Handler();
  20. };
  21.  
  22. // pipe server class
  23. class srv_cPipeServer {
  24. private:
  25.     HANDLE         hEventShutdown;
  26.     HANDLE      *  phThread;
  27.     srv_cThread ** ppThread;
  28.  
  29.     int NumThreads;
  30.  
  31.     static unsigned _stdcall ServerThread(void *);
  32.  
  33. public:
  34.     srv_cPipeServer(int, DWORD = 60000);
  35.     ~srv_cPipeServer();
  36.  
  37.     void MainLoop();
  38. };
  39.  
  40. srv_cThread::srv_cThread(const char *pPipeName,
  41.     HANDLE hEventShutdown_, DWORD ClientConnectTimeOut)
  42. :   Listener(pPipeName, hEventShutdown, ClientConnectTimeOut)
  43. ,   hEventShutdown(hEventShutdown_)
  44. {
  45. }
  46.  
  47. srv_cThread::~srv_cThread()
  48. {
  49. }
  50.  
  51. void srv_cThread::Handler()
  52. {
  53.     if (Listener.InError()) {
  54.     return;
  55.     }
  56.  
  57.     while (TRUE) {
  58.  
  59.     unsigned long cbData;
  60.  
  61.     nmpipe_eRetcode rc = Listener.Connect(INFINITE);
  62.  
  63.     if (rc == nmpipeTimeOut) {
  64.         break;
  65.     }
  66.     else if (rc != nmpipeOK) {
  67.         SetEvent(hEventShutdown);
  68.         break;
  69.     }
  70.  
  71.     if (Listener.Read(&cbData, sizeof(cbData)) != nmpipeOK) {
  72.  
  73.         Listener.Disconnect();
  74.         continue;
  75.     }
  76.  
  77.     char *pData = new char [cbData];
  78.     if (Listener.Read(pData, cbData) != nmpipeOK) {
  79.         delete pData;
  80.  
  81.         Listener.Disconnect();
  82.         continue;
  83.     }
  84.     
  85.     if (strcmp(pData, "shutdown") == 0) {
  86.         SetEvent(hEventShutdown);
  87.     }
  88.     
  89.     strrev(pData);
  90.     
  91.     if (Listener.Write(&cbData, sizeof(cbData)) != nmpipeOK) {
  92.         delete pData;
  93.  
  94.         Listener.Disconnect();
  95.         continue;
  96.     }
  97.  
  98.     if (Listener.Write(pData, cbData) != nmpipeOK) {
  99.         delete pData;
  100.  
  101.         Listener.Disconnect();
  102.         continue;
  103.     }
  104.     
  105.     delete pData;
  106.     
  107.     Listener.Disconnect();
  108.     }
  109.  
  110.     return;
  111. }
  112.  
  113. srv_cPipeServer::srv_cPipeServer(int NumThreads_, DWORD ClientConnectTimeOut)
  114. :   NumThreads(NumThreads_)
  115. ,   phThread(new HANDLE [NumThreads_])
  116. ,   ppThread(new srv_cThread * [NumThreads_])
  117. ,   hEventShutdown(0)
  118. {
  119.     memset(phThread, 0, sizeof(HANDLE) * NumThreads);
  120.  
  121.     hEventShutdown = CreateEvent(NULL, TRUE, FALSE, NULL);
  122.  
  123.     if (!hEventShutdown) {
  124.     printf("Failure: CreateEvent() -- WinError = %u\n", GetLastError());
  125.     return;
  126.     }
  127.  
  128.     for (int i=0; i<NumThreads; i++) {
  129.     unsigned Tid;
  130.     
  131.     ppThread[i] = new srv_cThread("\\\\.\\PIPE\\MYPIPE.PIP",
  132.                 hEventShutdown, ClientConnectTimeOut);
  133.     
  134.     phThread[i] = (HANDLE) _beginthreadex(NULL, 0, ServerThread,
  135.             ppThread[i], 0, &Tid);
  136.     
  137.     if (!phThread[i]) {
  138.         printf("Failure: _beginthreadex() -- errno = %u\n", _errno);
  139.     }
  140.     }
  141. }
  142.  
  143. srv_cPipeServer::~srv_cPipeServer()
  144. {
  145. }
  146.  
  147. unsigned _stdcall srv_cPipeServer::ServerThread(void *pThreadData_)
  148. {
  149.     printf("Starting thread %u\n", GetCurrentThreadId());
  150.  
  151.     srv_cThread *pThread = (srv_cThread *) pThreadData_;
  152.  
  153.     pThread -> Handler();
  154.  
  155.     delete pThread;
  156.  
  157.     printf("Ending thread %u\n", GetCurrentThreadId());
  158.  
  159.     return 0;
  160. }
  161.  
  162. void srv_cPipeServer::MainLoop()
  163. {
  164.     // For for all threads to end.
  165.     DWORD rc = WaitForMultipleObjects(NumThreads, phThread, TRUE, INFINITE);
  166.  
  167.     for (int i=0; i<NumThreads; i++) {
  168.     if (phThread[i]) {
  169.         CloseHandle(phThread[i]);
  170.     }
  171.     }
  172.  
  173.     CloseHandle(hEventShutdown);
  174.  
  175.     if (rc == WAIT_FAILED) {
  176.     printf("Failure: WaitForMultipleObjects() -- WinError = %u\n",
  177.         GetLastError());
  178.     }
  179.  
  180.     if (rc == WAIT_TIMEOUT) {
  181.     printf("Failure: WaitForMultipleObjects() -- time-out\n");
  182.     }
  183. }
  184.  
  185. int main()
  186. {
  187.     OSVERSIONINFO OSVersionInfo;
  188.  
  189.     OSVersionInfo.dwOSVersionInfoSize = sizeof(OSVersionInfo);
  190.  
  191.     GetVersionEx (&OSVersionInfo);
  192.  
  193.     if (OSVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT) {
  194.     printf("Named pipe servers are only supported on Windows NT.\n");
  195.     return -1;
  196.     }
  197.  
  198.     srv_cPipeServer PipeServer(10);
  199.  
  200.     PipeServer.MainLoop();
  201.  
  202.     return 0;
  203. }
  204.  
  205.