Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PZ.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.24 Mб
Скачать

Приложение а.4 Файл «Server.Cpp»

#include <iostream>

#include <string>

#include <windows.h>

#include <conio.h>

HANDLE hTread;

HANDLE semaphore;

HANDLE box;

HANDLE box_COLLECTOR;

HANDLE hFile;

HANDLE hFileCOPY;

LARGE_INTEGER File_Size;

OVERLAPPED over;

OVERLAPPED over_write;

BITMAPFILEHEADER File_header;

BITMAPINFOHEADER Info_header;

bool state = false;

bool finich = true;

char filename[256];

char filenamecopy[256];

int process_count = 1;

int part_number = 0;

const int part_size = 255;

const int delay = 1;

struct protocol

{

char connect = 0;

char disconnect = 1;

char file = 2;

char file_to_proccessor = 3;

char kill_proccessor = 4;

char error = 5;

}prot;

DWORD WINAPI Listener(LPVOID)

{

box_COLLECTOR = CreateMailslot("\\\\.\\mailslot\\COLLECTOR", 424, 0, NULL);

DWORD dwNextSize, dwCountBytes;

byte read_buf[424] = "";

int read_count = 0;

char name_full[256] = "";

char* last = strrchr(filename, '.');

memcpy(name_full, filename, last - filename);

strcat(name_full, "(копия).");

strcat(name_full, last + 1);

hFileCOPY = CreateFile(name_full, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_FLAG_OVERLAPPED, 0);

over_write.hEvent = CreateEvent(NULL, false, false, NULL);

over_write.Offset = 0;

over_write.OffsetHigh = 0;

WriteFile(hFileCOPY, &File_header, sizeof(File_header), &dwCountBytes, &over_write);

over_write.Offset += sizeof(File_header);

WriteFile(hFileCOPY, &Info_header, sizeof(Info_header), &dwCountBytes, &over_write);

over_write.Offset += sizeof(Info_header);

while (1){

GetMailslotInfo(box_COLLECTOR, NULL, &dwNextSize, NULL, NULL);

if ((dwNextSize | 0xffff0000) != MAILSLOT_NO_MESSAGE){

ReadFile(box_COLLECTOR, &read_buf, sizeof(read_buf), &dwCountBytes, 0);

if (read_buf[0] == prot.file_to_proccessor){

int j = 0;

char tmp[10] = "";

for (int i = 1; i < 11; i++){

if (read_buf[i] != '$'){ tmp[j] = read_buf[i]; j++; }

else{ j++; break; }

}

j++;

int part_number_local = atoi(tmp);

char data[424] = "";

int k = 0;

memcpy(data, strchr((char*)read_buf, '$') + 1, dwCountBytes - strlen(tmp) - 2 - 1);

int last = dwCountBytes - 4;

over_write.Offset = sizeof(File_header) + sizeof(Info_header) + part_number_local * part_size;

WriteFile(hFileCOPY, data, last, NULL, &over_write);

read_count++;

if (read_count >= part_number){

if (part_size > File_Size.QuadPart){

over_write.Offset = (File_Size.QuadPart - last);

}

else{

over_write.Offset = File_Size.QuadPart - part_size;

}

int deficit = Info_header.biWidth % 4;

if (deficit == 4){

deficit = 0;

}

memset(&read_buf, 0, sizeof(read_buf));

WriteFile(hFileCOPY, read_buf, deficit, &dwCountBytes, &over_write);

Sleep(100);

printf("Файл %s успешно обработан.\n", filename);

break;

}

}

}

Sleep(delay);

}

char buf[424] = "";

buf[0] = { prot.file };

HANDLE Send = CreateFile("\\\\.\\mailslot\\Interface", GENERIC_ALL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

WriteFile(Send, &buf, sizeof(buf), &dwCountBytes, 0);

CloseHandle(Send);

CloseHandle(hFileCOPY);

CloseHandle(box_COLLECTOR);

ExitThread(0);

}

void main(int args, char *argv[])

{

setlocale(LC_ALL, "Russian");

SetConsoleTitle("Server");

SetWindowPos(GetConsoleWindow(), HWND_TOP, 1, 1, 480, 640, 0);

semaphore = CreateSemaphore(NULL, 1, 1, "mysem");

if (semaphore == NULL){

printf("Не удалось создать семафор.\n");

getch();

exit(0);

}

box = CreateMailslot("\\\\.\\mailslot\\Server", 424, 0, NULL);

DWORD dwNextSize, dwCountBytes;

byte read_buf[424] = "";

while (1){

GetMailslotInfo(box, NULL, &dwNextSize, NULL, NULL);

if ((dwNextSize | 0xffff0000) != MAILSLOT_NO_MESSAGE){

ReadFile(box, &read_buf, sizeof(read_buf), &dwCountBytes, 0);

if (read_buf[0] - 48 == prot.connect){

if (state == false){

state = true;

char buf[1] = { prot.connect };

HANDLE Send = CreateFile("\\\\.\\mailslot\\Interface", GENERIC_ALL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

WriteFile(Send, &buf, sizeof(buf), &dwCountBytes, 0);

CloseHandle(Send);

printf("Интерфейс подключен.\n");

}

}

if (read_buf[0] - 48 == prot.disconnect){

if (state == true){

state = false;

printf("Интерфейс отключен.\n");

for (int i = 0; i < process_count; i++){

char buf[424] = "";

char addr[1024] = "";

memset(&buf, 0, sizeof(buf));

buf[0] = prot.kill_proccessor;

sprintf(addr, "\\\\.\\mailslot\\Proccessor%d", i + 1);

HANDLE Send_kill = CreateFile(addr, GENERIC_ALL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

WriteFile(Send_kill, &buf, sizeof(buf), &dwCountBytes, 0);

CloseHandle(Send_kill);

}

}

}

if (read_buf[0] - 48 == prot.file){

if (state == true){

finich = false;

part_number = 0;

int j = 0;

char tmp_process_count[10] = "";

for (int i = 1; i < 11; i++){

if (read_buf[i] != '$'){ tmp_process_count[j] = read_buf[i]; j++; }

else{ j++; break; }

}

j++;

process_count = atoi(tmp_process_count);

int k = 0;

while (read_buf[j] != 0){

filename[k] = read_buf[j]; k++; j++;

}

hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);

if (hFile == INVALID_HANDLE_VALUE){

printf("Не удалось открыть файл.\n");

char buf[1] = { prot.error };

HANDLE Send = CreateFile("\\\\.\\mailslot\\Interface", GENERIC_ALL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

WriteFile(Send, &buf, sizeof(buf), &dwCountBytes, 0);

CloseHandle(Send);

}

else

{

DWORD readed = 0;

over.hEvent = CreateEvent(NULL, false, false, NULL);

over.Offset = 0;

over.OffsetHigh = 0;

File_Size.LowPart = 0;

File_Size.HighPart = 0;

File_Size.LowPart = GetFileSize(hFile, (LPDWORD)File_Size.HighPart);

if ((File_Size.QuadPart - sizeof(File_header) - sizeof(Info_header)) < process_count * part_size){

process_count = process_count / part_size;

process_count++;

}

for (int i = 0; i < process_count; i++){

char cmd[1024];

STARTUPINFOA si;

PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof(si));

si.cb = sizeof(si);

ZeroMemory(&pi, sizeof(pi));

si.dwFlags = si.dwFlags | STARTF_USEPOSITION;

si.dwX = 480; si.dwY = i * 100;

sprintf(cmd, "Proccessor.exe %d %d", i + 1, part_number);

CreateProcessA(0, (LPSTR)cmd, 0, 0, 0, CREATE_NEW_CONSOLE, 0, 0, &si, &pi);

}

printf("Процессы обработки запущены.\n");

Sleep(200);

ReadFile(hFile, &File_header, sizeof(File_header), &readed, &over);

over.Offset += sizeof(File_header);

ReadFile(hFile, &Info_header, sizeof(Info_header), &readed, &over);

over.Offset += sizeof(Info_header);

hTread = CreateThread(NULL, 0, Listener, 0, 0, NULL);

char addr[1024] = "";

char buf[424] = "";

char tmp[10] = "";

int count = 0;

char Buf_Color[part_size];

do{

if (File_Size.QuadPart < part_size){

readed = File_Size.QuadPart - sizeof(File_header) - sizeof(Info_header);

}

else{

if (File_Size.QuadPart - over.Offset < part_size){

readed = File_Size.QuadPart - over.Offset;

}

else{

readed = part_size;

}

}

memset(&Buf_Color, 0, sizeof(Buf_Color));

memset(&buf, 0, sizeof(buf));

ReadFile(hFile, &Buf_Color, readed, NULL, &over);

over.Offset += readed;

itoa(part_number, tmp, 10);

buf[0] = prot.file_to_proccessor;

strcat(buf, tmp);

strcat(buf, "$");

int dop = strlen(buf);

memcpy(strchr(buf, '$') + 1, Buf_Color, readed);

part_number++;

count++;

sprintf(addr, "\\\\.\\mailslot\\Proccessor%d", count);

HANDLE Send = CreateFile(addr, GENERIC_ALL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

WriteFile(Send, &buf, dop + readed + 1, &dwCountBytes, 0);

CloseHandle(Send);

if (count == process_count){

count = 0;

}

}while (over.Offset < File_Size.QuadPart);

Sleep(100);

for (int i = 0; i < process_count; i++){

memset(&buf, 0, sizeof(buf));

buf[0] = prot.kill_proccessor;

sprintf(addr, "\\\\.\\mailslot\\Proccessor%d", i + 1);

HANDLE Send_kill = CreateFile(addr, GENERIC_ALL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

WriteFile(Send_kill, &buf, sizeof(buf), &dwCountBytes, 0);

}

}

finich = true;

CloseHandle(hFile);

WaitForSingleObject(hTread, INFINITE);

CloseHandle(hTread);

}

else{

char buf[1] = { prot.error };

HANDLE Send = CreateFile("\\\\.\\mailslot\\Interface", GENERIC_ALL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

WriteFile(Send, &buf, sizeof(buf), &dwCountBytes, 0);

CloseHandle(Send);

}

}

}

Sleep(delay);

}

CloseHandle(semaphore);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]