Если вы действительно беспокоитесь о разных платформах и языках, обязательно учтите endian проблемы. Бинарный протокол, разработанный для этого использования, должен использовать сетевой порядок байтов, поэтому ему нужны настраиваемые функции сериализации для каждого типа данных; вы не можете просто вслепую вставлять структуры C в сетевые буферы.
Распространенным решением этой проблемы в игровых компаниях является наличие языка или спецификации описания протокола в простом формате, таком как XML или python или lua, а затем генерация кода для каждого целевого языка, который генерирует классы пакетов как со структурой данных, так и с сериализацией , Эта спецификация может использовать систему типов, которая начинается с базовых типов, а затем расширяется и включает специфичные для игры типы с семантической информацией, перечислениями или более сложными структурами. Например, файл данных может выглядеть так:
Attack = {
source = 'objectId',
target = 'objectId',
weapon = 'weapon::WEAP_MAIN',
seed = 'int'
}
Это может генерировать код вроде:
#define PT_ATTACK 10002
class PacketAttack : public Packet {
public:
PacketAttack () : m_packetType(PacketAttack::s_packetType) {}
ObjectId m_source;
ObjectId m_target;
WeaponType m_weapon;
int m_seed;
bool Write(Stream* outStream) {
Packet::Write(outStream);
outStream << m_source;
outStream << m_target;
outStream << m_weapon
outStream << m_seed;
}
bool Read(Stream* inStream);
static const int s_packetType;
};
Для этого требуется больше инфраструктуры. Потоки, базовые классы пакетов, функции безопасной сериализации.