Здравствуйте! Написав сервер с использование libevent, у меня теперь стоит... - вопрос №1136935

задача создать структуру, с помощью которой будет происходить общение клиентов с сервером. Пока пытаюсь разобрать простые примеры. Необходимо передать структуру по сети от клиента серверу. Для получения представления, как это работает, я использую простые сокеты и их методы send и recv. Думаю, так как аналогичные методы libevent принимают и передают массив байт, как и методы для сокетов, то разницы не будет. Пока пробую следующее: Отправка: send(ClientSocket[1],(char *)&msg,sizeof(msg),0); Прием: recv(Socket,(char *)&msg,sizeof(msg),0);, где msg это объект структуры — не важно какой у неё набор полей(наверно). Естественно структуры на сервере и клиенте дублируются, то есть идентичны. Ибо у меня с первого раза ничего не работает, этот случай не стал исключением. Собственно, пример является только одним из многих вариантов попробованных мной. Если кто-нибудь пробовал передать структуру по сети, знает как это сделать или просто есть идея, буду рад всем вариантам. Спасибо!
01.08.14
1 ответ
cpp

Ответы

Если речь идет о бинарной передаче, то в силу того, что клиент и сервер это могут быть абсолютно разные по архитектуре хосты, а сам клиент и сервер могут быть собраны с различными настройками компилятора, тем более разной разрядностью компилятора, структуры упаковывают в так называемый сетевой формат с помощью так называемых функций конвертации

uint32_t htonl(uint32_t hostlong); — конвертирует 32-битную беззнаковую величину из локального порядка байтов в сетевой;
uint16_t htons(uint16_t hostshort); — конвертирует 16-битную беззнаковую величину из локального порядка байтов в сетевой;

на сервере в свою очередь используются обратные приведенным для конвертировки из сетевого формата в локального хоста ntohl, ntohs

Поэтому, каждый член данных структуры должен быть упакован приведенными мной функциями перед отправкой, а сама структура должна быть оформлена платформо-независимыми типами

int8_t uint8_t
int16_t uint16_t
int32_t uint32_t
int64_t uint64_t
....
которые нивелируют разрядность компилятора.

Ну, а текстовый формат ты можешь слать как угодно, хоть в JSON, хоть XML, хоть в своем собственном формате.
01.08.14
Посмотреть всех экспертов из раздела Технологии > C/C++
Пользуйтесь нашим приложением Доступно на Google Play Загрузите в App Store