Skip to content

Многопоточная кроссплатформенная система обмена данными

Notifications You must be signed in to change notification settings

gl-ser/Exchanger

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Exchanger

Многопоточная кроссплатформенная система обмена данными (МКСОД)

МКСОД построена по принципу "точка-точка", предназначена для взаимодействия между пользователями ОС Windows и ОС Astra Linux, работающими под различными мандатными метками.

Для работы под Astra Linux на всех уровнях доступа Exchanger требует, чтобы запускающему её пользователю были выставлены 3 следующие привилегии:

  • parsec_cap_priv_sock
  • parsec_cap_mac_sock
  • parsec_cap_chmac

Использует функционал:

  • Qt 5;
  • сторонней библиотеки ZLib;
  • сторонней библиотеки QuaZIP;
  • класса статических методов конвертации времени Calendar.

Состоит из 13 классов: TByteBuffer, TFile, TCheckSum, TBasicThread, TZIPThread, TNetSendThread, TNetReceiveThread, TReceivePartFileThread, TSendPartFileThread, TSendKvitThread, TBasicServerTCP, TSendFolderThread, TReceiveFolderServer.

Располагается в подкаталоге EngineMKSOD


В подкаталоге AbonentMKSOD находится приложение, демонстрирующее работу движка МКСОД

Использует функционал:

  • Qt 5;
  • сторонней библиотеки ZLib;
  • сторонней библиотеки QuaZIP;
  • класса статических методов конвертации времени Calendar.
  • МКСОД EngineMKSOD.

В подкаталоге QuaZIP находится сторонняя объектно-ориентированная библиотека ZIP-архиватор QuaZIP

Использует функционал:

  • Qt 5;
  • сторонней библиотеки ZLib.

В подкаталоге ReStartMKSOD находится утилита для приложения AbonentMKSOD

Использует функционал:

  • Qt 5.

В подкаталоге ZLib находится сторонняя библиотека ZIP-архиватор ZLib


1. TByteBuffer

Байтовый буфер

Публичные методы

1.1. Clear очищает буфер

Синтаксис:

void Clear(void)

1.2. SetSize устанавливает размер буфера

Синтаксис:

void SetSize(int Value)

1.3. IsFull возвращает true, если буфер полный

Синтаксис:

bool IsFull(void)

1.4. Data возвращает содержимое буфера

Синтаксис:

QByteArray Data(void)

1.5. Count возвращает количество байт в буфере

Синтаксис:

int Count(void)

1.6. PushBack вставляет в конец буфера данные. Что влезло - то влезло. Возвращает количество добавленных байт

Синтаксис:

int PushBack(QByteArray Value)

2. TFile

Работа с файлом

Публичные типы

//Тип описывает границы одной области файла отображаемого в память
struct MMFileIndex
{
  MMFileIndex() : start(0LL), stop(0LL), buf_unsigned_char(NULL),
                  buf_const_char(NULL), size(0LL) {}
  long long start;             //Левая граница области
  long long stop;              //Правая граница области
  uchar* buf_unsigned_char;    //Указатель на начало области
  const char* buf_const_char;  //Указатель на начало области
  long long size;              //Размер области в байтах
};
typedef struct MMFileIndex TMMFileIndex;


//Тип описывает вектор границ областей файла отображаемого в память
// buf_unsigned_char и buf_const_char нулевого элемента вектора 
// указывают на начало Memory
// Сумма size всех элементов вектора - это размер всего Memory
typedef std::vector<TMMFileIndex> TMMFileIndexes;


//Тип описывает границы одной области файла. Границы устанавливаются методом seek
struct FileIndex
{
  FileIndex() : start(0LL), stop(0LL), size(0LL) {}
  long long start;  //Левая граница области
  long long stop;   //Правая граница области
  long long size;   //Размер области в байтах
};
typedef struct FileIndex TFileIndex;


//Тип описывает вектор границ областей файла. Границы устанавливаются методом seek
// Сумма size всех элементов вектора - это размер всего файла
typedef std::vector<TFileIndex> TFileIndexes;

Публичные методы

2.1. CreateEmptyFile создает пустой файл заданного размера

На вход подаются:

  • путь и имя файла;
  • размер файла в байтах.

На выходе можно получить:

  • true в случае успешного создания файла

Синтаксис:

static bool CreateEmptyFile(QString FilePathName, long long Size)

2.2. GetFileSize возвращает размер файла

На вход подаются:

  • путь и имя файла.

На выходе можно получить:

  • размер файла в байтах

Синтаксис:

static long long GetFileSize(QString FilePathName)

2.3. GetFileName возвращает имя файла

На вход подаются:

  • путь и имя файла.

На выходе можно получить:

  • имя файла

Синтаксис:

static QString GetFileName(QString FilePathName)

2.4. FileExist проверяет существование файла

На вход подаются:

  • путь и имя файла.

На выходе можно получить:

  • true если файл существует

Синтаксис:

static bool FileExist(QString FilePathName)

2.5. DelFile удаляет файл

На вход подаются:

  • путь и имя файла.

На выходе можно получить:

  • true в случае успеха

Синтаксис:

static bool DelFile(QString FilePathName)

2.6. ClearDir удаляет все файлы из заданного каталога (сам каталог НЕ удаляется)

На вход подаются:

  • путь и имя каталога

Синтаксис:

static void ClearDir(QString DirPathName)

2.7. SplitFile разрезает ранее открытый Memory Mapped File на заданное количество областей.

Заполняет свойство Indexes массивом границ областей файла

На вход подаются:

  • размер файла в байтах;
  • количество нарезаемых областей

На выходе можно получить:

  • вектор границ областей файла

Синтаксис:

static TFileIndexes SplitFile(long long FileSize, int Quantity)

2.8. SavePartFile сохраняет часть файла

На вход подаются:

  • путь и имя файла;
  • массив байт для записи;
  • позиция начала записи.

На выходе можно получить:

  • true в случае успеха

Синтаксис:

static bool SavePartFile(QString FilePathName, QByteArray Array, long long StartIndex)

2.9. OpenMMFile открывает файл как Memory Mapped File

Если физический файл очень большой, он не может быть отображен в память

На вход подаются:

  • путь и имя файла;
  • true в случае только чтения.

На выходе можно получить:

  • true в случае успешного открытия файла

Синтаксис:

bool OpenMMFile(QString FilePathName, bool ReadOnly)

2.10. CloseMMFile закрывает ранее открытый Memory Mapped File

Синтаксис:

void CloseMMFile(void)

2.11. SplitMMFile разрезает ранее открытый Memory Mapped File на заданное количество областей.

Заполняет свойство Indexes массивом границ областей файла

На вход подаются:

  • количество нарезаемых областей

На выходе можно получить:

  • true в случае успешного нарезания файла

Синтаксис:

bool SplitMMFile(int Quantity)

Публичное свойство

2.12. MMFileIndexes массив границ областей файла отображаемого в память.

Заполняется методом SplitMMFile

Синтаксис:

TMMFileIndexes MMFileIndexes

3. TCheckSum

Подсчет контрольной суммы

Публичные методы

3.1. ByteArrayMD5 вычисляет контрольную сумму QByteArray по алгоритму MD5

На вход подаются:

  • QByteArray.

На выходе можно получить:

  • строка из 32 символов, содержащая контрольную сумму QByteArray

Синтаксис:

static QString ByteArrayMD5(QByteArray ByteArray)

3.2. StrMD5 вычисляет контрольную сумму строки по алгоритму MD5

На вход подаются:

  • строка.

На выходе можно получить:

  • строка из 32 символов, содержащая контрольную сумму строки

Синтаксис:

static QString StrMD5(QString Str)

3.3. FileMD5 вычисляет контрольную сумму файла по алгоритму MD5

На вход подаются:

  • путь и имя файла.

На выходе можно получить:

  • строка из 32 символов, содержащая контрольную сумму файла

Синтаксис:

static QString FileMD5(QString FilePathName)

4. TBasicThread

Базовый поток

Использует функционал класса статических методов конвертации времени Calendar

Публичные сигналы

4.1. Error сигнал генерируется в случае возникновения ошибки в потоке

Возвращает:

  • номер потока;
  • длительность работы потока [сек];
  • описание ошибки

Синтаксис:

void Error(int Number, int Duration, QString Str);

4.2. Success сигнал генерируется в случае успешного завершения потока

Возвращает:

  • номер потока;
  • длительность работы потока [сек]

Синтаксис:

void Success(int Number, int Duration);

4.3. Message сигнал генерируется при необходимости передачи словесного сообщения вызывающей программе

Возвращает:

  • номер потока;
  • текст сообщения

Синтаксис:

void Message(int Number, QString Str);

Публичный тип

//Тип описывает состояние потока
enum TStatus
{
  NONE = 0,           //Поток НЕ запускался
  WORK = 1,           //Поток работает
  FINISH_ERROR = 2,   //Поток завершился с ошибкой
  FINISH_SUCCESS = 3  //Поток завершился успешно
};

Публичные методы

4.4. SetNumber устанавливает номер потока

Синтаксис:

void SetNumber(int _Number)

4.5. GetNumber возвращает номер потока

Синтаксис:

int GetNumber(void)

4.6. GetDuration возвращает длительность работы потока [сек]

Синтаксис:

int GetDuration(void)

4.7. GetStatus возвращает состояние потока

Синтаксис:

TStatus GetStatus(void)

4.8. GetErrorNote возвращает описание ошибки

Синтаксис:

QString GetErrorNote(void)

5. TZIPThread

Поток ZIP-архиватор

Использует функционал сторонней библиотеки quazip

Публичные методы

5.1. SetPaths устанавливает для сжатия\распаковки следующие атрибуты:

  • путь и имя каталога;
  • путь и имя ZIP-файла

Синтаксис:

void SetPaths(QString _DirPathName, QString _ZIPFilePathName)

5.2. CompressDir ставит задачу сжатия каталога в ZIP-архив

Синтаксис:

void CompressDir(void)

5.3. ExtractDir ставит задачу распаковки ZIP-архива в каталог

Синтаксис:

void ExtractDir(void)

5.4. GetDirPathName возвращает путь и имя каталога

Синтаксис:

QString GetDirPathName(void)

5.5. GetZIPFilePathName возвращает путь и имя ZIP-файла

Синтаксис:

QString GetZIPFilePathName(void)

6. TNetSendThread

Поток отправки данных по локальной сети

Публичный тип

//Тип описывает атрибуты сетевого абонента
struct Abonent
{
  Abonent() : Name(""), Address(""), PortTCP(0) {}
  QString Name;     //Имя абонента
  QString Address;  //IPv4-адрес абонента
  int PortTCP;      //TCP-порт абонента
};
typedef struct Abonent TAbonent;

Публичные методы

6.1. SetAbonent устанавливает атрибуты сетевого абонента:

  • имя;
  • IPv4-адрес;
  • TCP-порт

Синтаксис:

void SetAbonent(QString _Name, QString _Address, int _PortTCP)

6.2. GetAbonent возвращает атрибуты сетевого абонента

Синтаксис:

TAbonent GetAbonent(void)

6.3. IsNotEmptyAbonent

Возвращает true, если атрибуты абонента заполнены (отличны от значений по умолчанию)

Возвращает false, если атрибуты абонента соответствуют значениям по умолчанию

Синтаксис:

bool IsNotEmptyAbonent(void)

6.4. SetAnswerPortTCP устанавливает номер TCP-порта для ответа (квитирования)

Синтаксис:

void SetAnswerPortTCP(int _AnswerPortTCP)

6.5. GetAnswerPortTCP возвращает номер TCP-порта для ответа (квитирования)

Синтаксис:

int GetAnswerPortTCP(void)

7. TNetReceiveThread

Поток приема данных из локальной сети

Использует функционал класса TByteBuffer

Публичные методы

7.1. CheckStart засекает время начала работы потока, очищает атрибут ErrorNote

Синтаксис:

void CheckStart(void)

7.2. SetSocket устанавливает сокет, по которому будут приходить данные из локальной сети

Синтаксис:

void SetSocket(QTcpSocket* _Socket)

7.3. SetTempCatalog устанавливает каталог временных файлов

Синтаксис:

void SetTempCatalog(QString _TempCatalog)

7.4. GetAddress возвращает IPv4-адрес TCP-клиента

Синтаксис:

QString GetAddress(void)

8. TReceivePartFileThread

Поток приема квитанции или части файла

Использует функционал класса TFile

Публичные типы

//Тип описывает заголовок получаемого файла
struct HeaderFile
{
  HeaderFile() : IsEmpty(true), KeyWord("<MKSOD_FILE>"), GUID(""), MD5(""), 
                 FileSize(0LL), StartIndex(0LL), IndexPart(0), CountParts(0), 
                 AnswerPortTCP(0), FilePathName("") {}
  bool IsEmpty;          //Если пустой, тогда true
  QString KeyWord;       //Ключевое слово (12 байт)
  QString GUID;          //Транспортное имя файла (38 байт)
  QString MD5;           //Контрольная сумма файла (32 байта)
  long long FileSize;    //Длина файла (8 байт)
  long long StartIndex;  //Индекс начала части файла (8 байт)
  int IndexPart;         //Порядковый номер части файла (4 байта)
  int CountParts;        //Количество частей файла (4 байта)
  int AnswerPortTCP;     //Номер порта для ответа (4 байта)
  QString FilePathName;  //Путь и имя файла

  //Инициализирующий метод
  void Empty(void);
};
typedef struct HeaderFile THeaderFile;


//Тип описывает заголовок получаемой квитанции
struct HeaderKvit
{
  HeaderKvit() : IsEmpty(true), KeyWord("<MKSOD_KVIT>"), GUID(""), Type(0), 
                 Err(0), AnswerPortTCP(0) {}
  bool IsEmpty;       //Если пустой, тогда true
  QString KeyWord;    //Ключевое слово (12 байт)
  QString GUID;       //Транспортное имя файла (38 байт)
  int Type;           //Тип квитанции (4 байта, 1 - успешно, 0 - неуспешно)
  int Err;            //Код ошибки (4 байта)
  int AnswerPortTCP;  //Номер TCP-порта для ответа (4 байта)

  //Инициализирующий метод
  void Empty(void);
};
typedef struct HeaderKvit THeaderKvit;

Публичные методы

8.1. GetFileHeader возвращает заголовок получаемого файла

Синтаксис:

THeaderFile GetFileHeader(void)

8.2. GetKvitHeader возвращает заголовок получаемой квитанции

Синтаксис:

THeaderKvit GetKvitHeader(void)

9. TSendPartFileThread

Поток отправки части файла по локальной сети

Публичный метод

9.1. SendPartFile передает внутрь потока данные, необходимые для отправки области (части) файла

На вход подаются:

  • путь и имя файла;
  • GUID являющийся временным (транспортным) именем файла (38 символов);
  • контрольная сумма файла (32 символа);
  • размер файла;
  • позиция в файле, с которой начинается отправляемая область (часть);
  • размер передаваемой области (части) файла;
  • порядковый номер передаваемой области (части) файла;
  • количество областей (частей) файла

Синтаксис:

void SendPartFile(QString _FilePathName, QString _GUID, QString _MD5, long long _FileSize, 
                  long long _StartIndex, long long _BufferSize, int _IndexPart, int _CountParts)

10. TSendKvitThread

Поток отправки квитанции

Публичный метод

10.1. SendKvit передает внутрь потока данные, необходимые для отправки квитанции

На вход подаются:

  • GUID являющийся временным (транспортным) именем файла (38 символов);
  • тип квитанции (1 - успешно, 0 - неуспешно);
  • код ошибки.

Коды ошибок:

  • 1 - ошибка распаковки ZIP-архива;
  • 2 - тайм-аут приема файла;
  • 3 - неверная контрольная сумма;
  • 4 - одна или несколько частей файла были получены с ошибкой

Синтаксис:

void SendKvit(QString _GUID, int _Type, int _Err)

11. TBasicServerTCP

Базовый сервер TCP

Использует функционал класса TNetReceiveThread

Публичные сигналы

11.1. ErrorServer сигнал генерируется в случае возникновения ошибки

Возвращает:

  • описание ошибки

Синтаксис:

void ErrorServer(QString Str)

11.2. MessageServer сигнал генерируется при необходимости передачи словесного сообщения вызывающей программе

Возвращает:

  • текст сообщения

Синтаксис:

void MessageServer(QString Str)

Публичные методы

11.3. Start запускает TCP-сервер

На вход подаются:

  • номер TCP-порта.

На выходе можно получить:

  • true в случае успешного запуска

Синтаксис:

bool Start(int _PortTCP)

11.4. Stop останавливает TCP-сервер

Синтаксис:

void Stop(void)

11.5. SetTempCatalog устанавливает каталог временных файлов

Синтаксис:

void SetTempCatalog(QString _TempCatalog)

11.6. GetPortTCP возвращает TCP-порт

Синтаксис:

int GetPortTCP(void)

12. TSendFolderThread

Поток отправки каталога по локальной сети

Использует функционал следующих классов: TSendPartFileThread, TCheckSum, TFile

Публичные методы

12.1. SetTempCatalog устанавливает каталог временных файлов

Синтаксис:

void SetTempCatalog(QString _TempCatalog)

12.2. SendFolder передает внутрь потока данные, необходимые для отправки каталога по локальной сети

На вход подаются:

  • путь и имя каталога, отправляемого по локальной сети

Синтаксис:

void SendFolder(QString _CatPathName)

13. TReceiveFolderServer

Сервер приема каталога, обработки и отправки квитанции

Использует функционал следующих классов: TCheckSum, TFile, TZIPThread, TSendKvitThread, TReceivePartFileThread

Публичный тип

//Тип описывает атрибуты расширенного сетевого абонента
struct AbonentExt
{
  AbonentExt() : FolderPathName("") {}
  TNetSendThread::TAbonent Base;  //Базовые атрибуты абонента
  QString FolderPathName;         //Путь и имя приемной папки абонента
};
typedef struct AbonentExt TAbonentExt;

Публичные сигналы

13.1. GotKvitError синал генерируется при получении по сети квитанции об ошибке передачи каталога

Возвращает:

  • сетевой абонент, от которого пришла квитанция;
  • транспортное имя файла;
  • код ошибки.

Коды ошибок:

  • 1 - ошибка распаковки ZIP-архива;
  • 2 - тайм-аут приема файла;
  • 3 - неверная контрольная сумма;
  • 4 - одна или несколько частей файла были получены с ошибкой

Синтаксис:

void GotKvitError(TReceiveFolderServer::TAbonentExt Abonent, QString FileName, int Err)

13.2. GotKvitSuccess синал генерируется при получении по сети квитанции об успешной передаче каталога

Возвращает:

  • сетевой абонент, от которого пришла квитанция;
  • транспортное имя файла

Синтаксис:

void GotKvitSuccess(TReceiveFolderServer::TAbonentExt Abonent, QString FileName)

Публичные методы

13.3. Start запускает TCP-сервер

На вход подаются:

  • номер TCP-порта.

На выходе можно получить:

  • true в случае успешного запуска

Синтаксис:

bool Start(int _PortTCP)

13.4. Stop останавливает TCP-сервер

Синтаксис:

void Stop(void)

13.5. AddAbonent добавляет нового сетевого абонента в массив

На вход подаются:

  • имя абонента;
  • IPv4-адрес абонента;
  • TCP-порт;
  • путь и имя приемной папки абонента

Синтаксис:

void AddAbonent(QString _Name, QString _Address, int _PortTCP, QString _FolderPathName)

13.6. SetTimeOut задает тайм-аут приема файла

На вход подаются:

  • временная задержка [мин];

Синтаксис:

void SetTimeOut(double Value)