Вы можете объявить статический символ без знака следующим образом:
#define MSGBUFSIZE 512
static unsigned char ClientSendBuf[MSGBUFSIZE];
, а затем скопировать вашу структуру в массив следующим образом:
memmove(&ClientSendBuf[2], &struct, sizeof(struct));
теперь это там, где это зависит от реализации.Я использую Borland C ++, поэтому моя отправка действует следующим образом:
ClientSocket->Socket->SendBuf(ClientSendBuf, ClientSendBuf[0]+CRC16SIZE);
Причина, по которой я использую ClientSendBuf [0], заключается в том, что размер моего сообщения хранится в ClientSendBuf [0] примерно так:
ClientSendBuf[0] = 4 + sizeof(struct); //Byte Count
(Примечание. Замените struct на имя вашего struct
)
Я также добавляю проверку CRC в конец моего сообщения следующим образом:
#define CRC16SIZE 2
...
cs = CheckSum((unsigned char *)ClientSendBuf, ClientSendBuf[0]);
memmove(&ClientSendBuf[ClientSendBuf[0]], &cs, CRC16SIZE);
...
unsigned short __fastcall TFormMenu::CheckSum(unsigned char *p, int length)
{
int i;
for (cs = 0, i = 0; i < length; i++) {
cs += p[i];
}
return cs;
}
По сути, эта простая проверка CRC заключается в суммировании всех байтов для определения того, что отправлено правильное количество байтов.Если данные должны быть искажены (что, впрочем, часто встречается при ошибочных соединениях WiFi), то сервер должен выдать ошибку CRC.
Все это предполагает, что у вас есть структура POD.Часть static
не нужна, но как я это сделал в своем конкретном приложении.Я также замутил некоторые детали.Пишите в комментариях, если у вас есть вопросы.YMMV.