У меня есть следующая структура C из исходного кода сервера, и многие похожие:
// preprocessing magic: 1-byte alignment
typedef struct AUTH_LOGON_CHALLENGE_C
{
// 4 byte header
uint8 cmd;
uint8 error;
uint16 size;
// 30 bytes
uint8 gamename[4];
uint8 version1;
uint8 version2;
uint8 version3;
uint16 build;
uint8 platform[4];
uint8 os[4];
uint8 country[4];
uint32 timezone_bias;
uint32 ip;
uint8 I_len;
// I_len bytes
uint8 I[1];
} sAuthLogonChallenge_C;
// usage (the actual code that will read my packets):
sAuthLogonChallenge_C *ch = (sAuthLogonChallenge_C*)&buf[0]; // where buf is a raw byte array
Это TCP-пакеты, и мне нужно реализовать что-то, что излучает и читает их в C #. Какой самый чистый способ сделать это?
Мой текущий подход включает
[StructLayout(LayoutKind.Sequential, Pack = 1)]
unsafe struct foo { ... }
и множество fixed
операторов для чтения и записи, но это кажется неуклюжим, и, поскольку сам пакет не имеет фиксированной длины, я не чувствую себя комфортно при его использовании. Также много работы.
Тем не менее, он хорошо описывает структуру данных, и протокол может со временем меняться, поэтому это может быть идеальным для обслуживания.
Какие у меня варианты? Будет ли проще просто написать это на C ++ и использовать магию .NET для этого?
Уточнение: мне также нужно обработать порядковые номера и строки с нулевым заполнением.