Advertisement
AlukardBF

os_laba3katya_server

Apr 3rd, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <Windows.h>
  2. #include <iostream>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. //Кол-во процессов
  7. const int proccesCount = 4;
  8.  
  9. BOOL SendPipe(HANDLE &pipe, int action)
  10. {
  11.     DWORD numBytesWritten = 0;
  12.     return WriteFile(
  13.         pipe,                               //handle именного pipe
  14.         &action,                            //данные для передачи
  15.         sizeof(int),                        //длина данных (в байтах)
  16.         &numBytesWritten,                   //действительное кол-во байт для хранения
  17.         NULL                                //не использовать overlapped I/O
  18.     );
  19. }
  20.  
  21. int main(int argc, const char** argv)
  22. {
  23.     SetConsoleOutputCP(1251);
  24.     //Получаем путь к файлу клиента, через путь к файлу сервера
  25.     WCHAR path[MAX_PATH];
  26.     GetModuleFileName(NULL, path, MAX_PATH);
  27.     WCHAR *lstChr = wcsrchr(path, '\\') + 1;
  28.     wcscpy(lstChr, L"os_laba3katya_client.exe");
  29.     //инфо для запуска дочерних процессов
  30.     STARTUPINFO si[proccesCount];
  31.     PROCESS_INFORMATION pi[proccesCount];
  32.     //Создаем pipe под кол-во потоков
  33.     HANDLE pipe[proccesCount];
  34.     for (int i = 0; i < proccesCount; i++)
  35.     {
  36.         pipe[i] = CreateNamedPipe(
  37.             L"\\\\.\\pipe\\laba",   //имя pipe
  38.             PIPE_ACCESS_OUTBOUND,   //pipe только на отправку
  39.             PIPE_TYPE_BYTE,         //тип передачи данных - byte stream
  40.             proccesCount,           //Макс. кол-во соединений
  41.             0,                      //нет буфера на выход
  42.             0,                      //нет буфера на вход
  43.             0,                      //стандартное время ожидания
  44.             NULL                    //стандартные security attributes
  45.         );
  46.     }
  47.  
  48.     for (int i = 0; i < proccesCount; i++)
  49.     {
  50.         ZeroMemory(&si[i], sizeof(STARTUPINFO));
  51.         si[i].cb = sizeof(STARTUPINFO);
  52.         ZeroMemory(&pi[i], sizeof(PROCESS_INFORMATION));
  53.         GetStartupInfo(&si[i]);
  54.         if (!CreateProcess(path, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si[i], &pi[i]))
  55.         {
  56.             cout << "Ошибка создания " << i + 1 << " процесса клиента!" << endl;
  57.             system("pause");
  58.             return 1;
  59.         }
  60.         if (!ConnectNamedPipe(pipe[i], NULL)) {
  61.             cout << "Ошибка подключения pipe к клиенту." << endl;
  62.             system("pause");
  63.             return 1;
  64.         }
  65.     }
  66.     //Далее основная логика по варианту
  67.  
  68.     int ch;
  69.     do
  70.     {
  71.         system("cls");
  72.         cout << "1. Заблокировать 1й клиент. 2. Разблокировать 1й клиент.\n3. Заблокировать 2й клиент. 4. Разблокировать 2й клиент.\n5. Заблокировать 3й клиент. 6. Разблокировать 3й клиент.\n7. Заблокировать 4й клиент. 8. Разблокировать 4й клиент.\n0. Выход\n> ";
  73.         cin >> ch;
  74.         // for (int i = 0; i < proccesCount; i++)
  75.         //{
  76.             if (ch == 1 || ch == 2) {
  77.                 if (!SendPipe(pipe[0], ch))
  78.                 {
  79.                     cout << "Проблема при отправке данных " << 1 << " клиенту." << endl;
  80.                     system("pause");
  81.                     return 1;
  82.                 }
  83.             }
  84.             else if (ch == 3 || ch == 4) {
  85.                 if (ch == 3)
  86.                     ch = 1;
  87.                 else
  88.                     ch = 2;
  89.                 if (!SendPipe(pipe[1], ch))
  90.                 {
  91.                     cout << "Проблема при отправке данных " << 2 << " клиенту." << endl;
  92.                     system("pause");
  93.                     return 1;
  94.                 }
  95.             }
  96.             else if (ch == 5 || ch == 6) {
  97.                 if (ch == 5)
  98.                     ch = 1;
  99.                 else
  100.                     ch = 2;
  101.                 if (!SendPipe(pipe[2], ch))
  102.                 {
  103.                     cout << "Проблема при отправке данных " << 3 << " клиенту." << endl;
  104.                     system("pause");
  105.                     return 1;
  106.                 }
  107.             }
  108.             else if (ch == 7 || ch == 8) {
  109.                 if (ch == 7)
  110.                     ch = 1;
  111.                 else
  112.                     ch = 2;
  113.                 if (!SendPipe(pipe[3], ch))
  114.                 {
  115.                     cout << "Проблема при отправке данных " << 4 << " клиенту." << endl;
  116.                     system("pause");
  117.                     return 1;
  118.                 }
  119.             }
  120.             else if (ch == 0)
  121.             {
  122.                 for (int i = 0; i < proccesCount; i++)
  123.                 {
  124.                     if (!SendPipe(pipe[i], ch))
  125.                     {
  126.                         cout << "Проблема при отправке данных " << i + 1 << " клиенту." << endl;
  127.                         system("pause");
  128.                         return 1;
  129.                     }
  130.                 }
  131.             }
  132.         //}
  133.     } while (ch != 0);
  134.  
  135.     for (int i = 0; i < proccesCount; i++)
  136.     {
  137.         DisconnectNamedPipe(pipe[i]);
  138.         CloseHandle(pipe[i]);
  139.     }
  140.     //CloseHandle(hMutex);
  141.     return 0;
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement