Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Windows.h>
- #include <iostream>
- #include <algorithm>
- using namespace std;
- //Кол-во процессов
- const int proccesCount = 4;
- BOOL SendPipe(HANDLE &pipe, int action)
- {
- DWORD numBytesWritten = 0;
- return WriteFile(
- pipe, //handle именного pipe
- &action, //данные для передачи
- sizeof(int), //длина данных (в байтах)
- &numBytesWritten, //действительное кол-во байт для хранения
- NULL //не использовать overlapped I/O
- );
- }
- int main(int argc, const char** argv)
- {
- SetConsoleOutputCP(1251);
- //Получаем путь к файлу клиента, через путь к файлу сервера
- WCHAR path[MAX_PATH];
- GetModuleFileName(NULL, path, MAX_PATH);
- WCHAR *lstChr = wcsrchr(path, '\\') + 1;
- wcscpy(lstChr, L"os_laba3katya_client.exe");
- //инфо для запуска дочерних процессов
- STARTUPINFO si[proccesCount];
- PROCESS_INFORMATION pi[proccesCount];
- //Создаем pipe под кол-во потоков
- HANDLE pipe[proccesCount];
- for (int i = 0; i < proccesCount; i++)
- {
- pipe[i] = CreateNamedPipe(
- L"\\\\.\\pipe\\laba", //имя pipe
- PIPE_ACCESS_OUTBOUND, //pipe только на отправку
- PIPE_TYPE_BYTE, //тип передачи данных - byte stream
- proccesCount, //Макс. кол-во соединений
- 0, //нет буфера на выход
- 0, //нет буфера на вход
- 0, //стандартное время ожидания
- NULL //стандартные security attributes
- );
- }
- for (int i = 0; i < proccesCount; i++)
- {
- ZeroMemory(&si[i], sizeof(STARTUPINFO));
- si[i].cb = sizeof(STARTUPINFO);
- ZeroMemory(&pi[i], sizeof(PROCESS_INFORMATION));
- GetStartupInfo(&si[i]);
- if (!CreateProcess(path, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si[i], &pi[i]))
- {
- cout << "Ошибка создания " << i + 1 << " процесса клиента!" << endl;
- system("pause");
- return 1;
- }
- if (!ConnectNamedPipe(pipe[i], NULL)) {
- cout << "Ошибка подключения pipe к клиенту." << endl;
- system("pause");
- return 1;
- }
- }
- //Далее основная логика по варианту
- int ch;
- do
- {
- system("cls");
- cout << "1. Заблокировать 1й клиент. 2. Разблокировать 1й клиент.\n3. Заблокировать 2й клиент. 4. Разблокировать 2й клиент.\n5. Заблокировать 3й клиент. 6. Разблокировать 3й клиент.\n7. Заблокировать 4й клиент. 8. Разблокировать 4й клиент.\n0. Выход\n> ";
- cin >> ch;
- // for (int i = 0; i < proccesCount; i++)
- //{
- if (ch == 1 || ch == 2) {
- if (!SendPipe(pipe[0], ch))
- {
- cout << "Проблема при отправке данных " << 1 << " клиенту." << endl;
- system("pause");
- return 1;
- }
- }
- else if (ch == 3 || ch == 4) {
- if (ch == 3)
- ch = 1;
- else
- ch = 2;
- if (!SendPipe(pipe[1], ch))
- {
- cout << "Проблема при отправке данных " << 2 << " клиенту." << endl;
- system("pause");
- return 1;
- }
- }
- else if (ch == 5 || ch == 6) {
- if (ch == 5)
- ch = 1;
- else
- ch = 2;
- if (!SendPipe(pipe[2], ch))
- {
- cout << "Проблема при отправке данных " << 3 << " клиенту." << endl;
- system("pause");
- return 1;
- }
- }
- else if (ch == 7 || ch == 8) {
- if (ch == 7)
- ch = 1;
- else
- ch = 2;
- if (!SendPipe(pipe[3], ch))
- {
- cout << "Проблема при отправке данных " << 4 << " клиенту." << endl;
- system("pause");
- return 1;
- }
- }
- else if (ch == 0)
- {
- for (int i = 0; i < proccesCount; i++)
- {
- if (!SendPipe(pipe[i], ch))
- {
- cout << "Проблема при отправке данных " << i + 1 << " клиенту." << endl;
- system("pause");
- return 1;
- }
- }
- }
- //}
- } while (ch != 0);
- for (int i = 0; i < proccesCount; i++)
- {
- DisconnectNamedPipe(pipe[i]);
- CloseHandle(pipe[i]);
- }
- //CloseHandle(hMutex);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement