mirror of
https://github.com/RetroDECK/Supermodel.git
synced 2024-11-30 01:25:49 +00:00
82 lines
1.2 KiB
C++
82 lines
1.2 KiB
C++
#ifndef _UDP_H_
|
|
#define _UDP_H_
|
|
|
|
namespace SMUDP
|
|
{
|
|
struct Packet
|
|
{
|
|
|
|
static const UINT32 BUFFER_SIZE_UDP = 1460;
|
|
|
|
UINT32 crc;
|
|
UINT16 currentID;
|
|
UINT16 totalIDs;
|
|
UINT16 flags;
|
|
UINT16 length;
|
|
UCHAR data[BUFFER_SIZE_UDP];
|
|
|
|
Packet() {
|
|
Init();
|
|
}
|
|
|
|
enum class PacketFlags {
|
|
newConnection = (1 << 0),
|
|
resend = (1 << 1),
|
|
ping = (1 << 2)
|
|
};
|
|
|
|
void Init() {
|
|
crc = 0;
|
|
currentID = 0;
|
|
totalIDs = 0;
|
|
flags = 0;
|
|
length = 0;
|
|
}
|
|
|
|
UINT32 CalcCRC() {
|
|
crc = CalcCRCVal();
|
|
}
|
|
|
|
UINT32 CalcCRCVal() {
|
|
|
|
UINT32 val = 0;
|
|
|
|
for (int i = 0; i < _countof(data); i++) {
|
|
val += data[i]; // crude but will catch the odd off by one error
|
|
}
|
|
|
|
return val;
|
|
}
|
|
|
|
bool ValidateCRC() {
|
|
return CalcCRCVal() == crc;
|
|
}
|
|
|
|
void CreatePacket(PacketFlags p) {
|
|
flags |= (UINT16)p;
|
|
}
|
|
|
|
void CalcTotalIDs(int bytes) {
|
|
totalIDs = bytes / sizeof(data);
|
|
|
|
if (bytes % sizeof(data)) {
|
|
totalIDs++;
|
|
}
|
|
}
|
|
|
|
int HeaderSize() {
|
|
return 12;
|
|
}
|
|
|
|
int Size() {
|
|
return HeaderSize() + length;
|
|
}
|
|
|
|
operator char*() { return (char*)this; }
|
|
operator const char*() { return (char*)this; }
|
|
};
|
|
|
|
typedef char PacketReply;
|
|
}
|
|
|
|
#endif |