Технологии

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

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

август 1, 2014 г.

  • Всего ответов: 1

  • Дима - аватарка

    Дима

    9-й в Технологиях

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

    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, хоть в своем собственном формате.

    август 1, 2014 г.