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

9 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.


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

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

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

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

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

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

В подкаталоге 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)