
- •Пояснительная записка
- •Оглавление
- •Введение
- •1 Постановка задачи
- •2 Выбор решения
- •2.1 Проектирование структуры системы
- •2.2 Проектирование протокола взаимодействия
- •2.3 Определение модулей программы
- •2.4 Проектирование интерфейсной части
- •2.5 Проектирование серверного приложения
- •3 Описание разработки программы
- •4 Отладка и тестирование
- •Заключение
- •Список используемых источников
- •Приложение а Листинги программы Приложение а.1 Файл «Program.Cs»
- •Приложение а.2 Файл «Message.Cs»
- •Приложение а.3 Файл «Form1.Cs»
- •Приложение а.4 Файл «Server.Cpp»
- •Приложение а.5 Файл «Processor.Cpp»
Приложение а.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);
}