Многопоточная кроссплатформенная система обмена данными (МКСОД)
МКСОД построена по принципу "точка-точка", предназначена для взаимодействия между пользователями ОС 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.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)
Работа с файлом
//Тип описывает границы одной области файла отображаемого в память
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.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)
Базовый поток
Использует функционал класса статических методов конвертации времени 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)
Поток 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)
Поток отправки данных по локальной сети
//Тип описывает атрибуты сетевого абонента
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)
Поток приема данных из локальной сети
Использует функционал класса 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)
Поток приема квитанции или части файла
Использует функционал класса 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.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.1. SendKvit передает внутрь потока данные, необходимые для отправки квитанции
На вход подаются:
- GUID являющийся временным (транспортным) именем файла (38 символов);
- тип квитанции (1 - успешно, 0 - неуспешно);
- код ошибки.
Коды ошибок:
- 1 - ошибка распаковки ZIP-архива;
- 2 - тайм-аут приема файла;
- 3 - неверная контрольная сумма;
- 4 - одна или несколько частей файла были получены с ошибкой
Синтаксис:
void SendKvit(QString _GUID, int _Type, int _Err)
Базовый сервер 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)
Поток отправки каталога по локальной сети
Использует функционал следующих классов: TSendPartFileThread, TCheckSum, TFile
12.1. SetTempCatalog устанавливает каталог временных файлов
Синтаксис:
void SetTempCatalog(QString _TempCatalog)
12.2. SendFolder передает внутрь потока данные, необходимые для отправки каталога по локальной сети
На вход подаются:
- путь и имя каталога, отправляемого по локальной сети
Синтаксис:
void SendFolder(QString _CatPathName)
Сервер приема каталога, обработки и отправки квитанции
Использует функционал следующих классов: 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)