Код: Выделить всё
#define PACKED_STRUCT struct __attribute__((packed))
typedef std::vector bytearray;
static PacketType ReadMemPacketType = 2 + PT_C2S_OFFSET(2);
PACKED_STRUCT ReadMemPayload {
bytearray data;
};
Это код векторной оболочки:
Код: Выделить всё
template
PACKED_STRUCT NetworkVector {
size_t data_array_size;
T* data_array;
explicit NetworkVector(std::vector vec) : data_array_size(vec.size()), data_array(vec.data()) { }
~NetworkVector() { delete[] data_array; }
NetworkVector() : NetworkVector(std::vector()) { }
NetworkVector(size_t size) : NetworkVector(std::vector(size)) { }
NetworkVector(T* begin, T* end) : NetworkVector(std::vector(begin, end)) { }
NetworkVector(std::vector orig, std::vector extra) : NetworkVector([&]() {
std::vector copy = orig;
copy.insert(copy.end(), extra.begin(), extra.end());
return copy;
}()) { }
static inline std::vector toVector(NetworkVector serializedVec) {
return std::vector(serializedVec.data_array, serializedVec.data_array + serializedVec.data_array_size);
}
};
Код: Выделить всё
typedef NetworkVector net_bytearray;
static PacketType ReadMemPacketType = 2 + PT_C2S_OFFSET(2);
PACKED_STRUCT ReadMemPayload {
net_bytearray data;
};
Код: Выделить всё
template
static Packet wrap(PacketType type, T structData) {
byte* dataPtr = reinterpret_cast(&structData);
bytearray data(dataPtr, dataPtr + sizeof(T));
return Packet(type, data); // the constructor automatically createss the header.
}
// wrap the struct first then serialize
bytearray serialize() const {
bytearray serializedHeader(sizeof(PacketHeader));
std::memcpy(serializedHeader.data(), &header, serializedHeader.size());
serializedHeader.insert(serializedHeader.end(), data.begin(), data.end());
return serializedHeader;
}
Код: Выделить всё
int Socket::sendData(bytearray data) {
int res = send(socketFd, data.data(), data.size(), 0);
if (res == -1) {
Logger::getLogger()->warn("Failed to send " + std::to_string(data.size()) + " bytes to SocketFd " + std::to_string(socketFd));
}
return res;
}
Код: Выделить всё
packet.sender.socket->sendData(
Packet::wrap(
S2C::ReadMemPacketType,
{ .data = net_bytearray(bytearray({255, 69})) }
).serialize()
);
Код: Выделить всё
0x02
0x00
0x00
0x00
0x88
0x20
0x45
0xeb
Код: Выделить всё
\x02\x00\x00\x00\x88\x70\x13\xf1
Код: Выделить всё
Info: Base address is non-null! Convert to std::vector and get the value!
fish: Job 1, './build_android/remdeb_app' terminated by signal SIGSEGV (Address boundary error)
https://github.com/ThatMG393/remdeb
< /blockquote>
Подробнее здесь: https://stackoverflow.com/questions/793 ... h-a-socket
Мобильная версия