RelayFile/Protocol/Communicate.cxx

94 lines
2.8 KiB
C++
Raw Normal View History

2025-05-05 23:22:43 +08:00
#include "Communicate.h"
2025-05-10 01:25:02 +08:00
constexpr unsigned char gHeader[] = {0xFF, 0xFE};
constexpr unsigned char gTail[] = {0xFF, 0xFF};
2025-05-05 23:22:43 +08:00
Communicate::Communicate()
{
2025-05-10 01:25:02 +08:00
}
/*
transm TCP
header 2 char: 0xFF 0xFE
unpack 1 char;
2025-05-10 01:25:02 +08:00
from 32 char:
to 32 char:
len 4 char:
data xxxxx:
tail 2 char: 0xFF 0xFF
*/
FrameBuffer* Communicate::ParseBuffer(MutBuffer& buffer)
{
FrameBuffer* frame = nullptr;
int find = buffer.IndexOf((const char*)gHeader, sizeof(gHeader));
if (find < 0) {
return frame;
}
int len = 0;
std::memcpy(&len, buffer.GetData() + find + sizeof(gHeader) + sizeof(uint8_t) + 64, sizeof(len));
if (buffer.Length() < (find + sizeof(gHeader) + sizeof(uint8_t) + 64 + len + sizeof(len) + sizeof(gTail)) || len < 0) {
2025-05-10 01:25:02 +08:00
return frame;
}
if (std::memcmp(buffer.GetData() + find + sizeof(gHeader) + sizeof(uint8_t) + 64 + sizeof(len) + len, gTail, sizeof(gTail)) !=
0) {
2025-05-10 01:25:02 +08:00
return frame;
}
frame = new FrameBuffer();
frame->fid = std::string(buffer.GetData() + find + sizeof(gHeader) + sizeof(uint8_t), 32);
frame->tid = std::string(buffer.GetData() + find + sizeof(gHeader) + sizeof(uint8_t) + 32, 32);
2025-05-10 01:25:02 +08:00
if (len > 0) {
frame->dataMut = new char[len];
std::memcpy(frame->dataMut, buffer.GetData() + find + sizeof(gHeader) + sizeof(uint8_t) + 64 + sizeof(len), len);
2025-05-10 01:25:02 +08:00
frame->len = len;
}
buffer.RemoveOf(0, find + sizeof(gHeader) + sizeof(uint8_t) + 64 + len + sizeof(len) + sizeof(gTail));
2025-05-10 01:25:02 +08:00
return frame;
}
bool Communicate::PackBuffer(FrameBuffer* frame, char** buf, int& len)
{
if (frame == nullptr) {
return false;
}
const char* dataPtr = nullptr;
if (frame->dataMut == nullptr) {
2025-05-10 01:25:02 +08:00
frame->len = 0;
}
if (frame->dataConst) {
dataPtr = frame->dataConst;
} else {
dataPtr = frame->dataMut;
}
len = sizeof(gHeader) + sizeof(uint8_t) + 64 + sizeof(len) + frame->len + sizeof(gTail);
2025-05-10 01:25:02 +08:00
*buf = new char[len];
std::memcpy(*buf, gHeader, sizeof(gHeader));
std::memcpy(*buf + sizeof(gHeader), &frame->unpack, sizeof(uint8_t));
std::memcpy(*buf + sizeof(gHeader) + sizeof(uint8_t), frame->fid.c_str(), 32);
std::memcpy(*buf + sizeof(gHeader) + sizeof(uint8_t) + 32, frame->tid.c_str(), 32);
std::memcpy(*buf + sizeof(gHeader) + sizeof(uint8_t) + 64, &frame->len, sizeof(len));
2025-05-10 01:25:02 +08:00
if (frame->len > 0) {
std::memcpy(*buf + sizeof(gHeader) + 64 + sizeof(len), dataPtr, frame->len);
2025-05-10 01:25:02 +08:00
}
std::memcpy(*buf + sizeof(gHeader) + 64 + sizeof(len) + frame->len, gTail, sizeof(gTail));
frame->dataConst = nullptr;
2025-05-10 01:25:02 +08:00
return true;
}
FrameBuffer::FrameBuffer()
{
dataConst = nullptr;
dataMut = nullptr;
len = 0;
}
2025-05-10 01:25:02 +08:00
FrameBuffer::~FrameBuffer()
{
delete[] dataMut;
2025-05-10 01:25:02 +08:00
len = 0;
}