Как я могу отправить эту структуру по сети? - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть следующая структура:

struct fetch_info_t {
    u_int8_t grocery_type;
    u_int8_t arg[1024];
} __attribute__((packed));

Я хотел бы отправить это через сокет на сервер, чтобы запросить данные. Я бы очень хотел избежать любых библиотек, таких как protobuf. grocery_type может быть любым значением от 1 до 255. Некоторые типы продуктов, например, тип 128, должны предоставлять дополнительную информацию. Недостаточно указать тип 128, я также хотел бы указать Cheeses в виде строки. С учетом вышесказанного, тип 129 должен предоставить число u_int32_t, а не строку, в отличие от 128.

В основном я выделил 1024 байта для дополнительной информации, которая может потребоваться системе. Вопрос в том, как отправить его через сокет, или, более конкретно, заполнить arg нужной информацией, не зависящей от системы ? Я знаю, что htonl на число можно использовать, но как мне на самом деле установить значение буфера для этого?

Я бы предположил, что отправка информации в конечном итоге приведет к приведению указателя структуры к массиву без знака и пошли это так через сокет. Дайте мне знать, если есть лучший способ.

1 Ответ

0 голосов
/ 01 апреля 2020

Вы не можете напрямую назначить 32-битное значение массиву, потому что правильное выравнивание не гарантируется.
memcpy() просто скопирует байты с проблемой несогласования.

u_int32_t the_value=htonl( ... );
struct fetch_info_t the_info;
the_info.grocery_type=129;
memcpy(the_info.arg, &the_value, sizeof(the_value));

Тогда, поскольку ваша структура упакована, вы можете отправить ее с

send(my_socket, &the_info,
     sizeof(the_info.grocery_type)+sizeof(the_value), 0);

В случае, если вам нужно отправить строку

char *the_text= ... ;
size_t the_size=strlen(the_text)+1;
struct fetch_info_t the_info;
the_info.grocery_type=128;
memcpy(the_info.arg, the_text, the_size);
send(my_socket, &the_info,
     sizeof(the_info.grocery_type)+the_size, 0);

Обратите внимание, что здесь передается '\0'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...