Можно ли отправить структуру с помощью SSL_write и SSL_read ?

#c #openssl

#c #openssl

Вопрос:

Можно ли отправлять и получать структуру с помощью SSL_write и SSL_read?

Клиент

 typedef struct{
      unsigned int userid;
      unsigned int name;        
} sendInfo;

  sendInfo infofile;



SSL_write(ssl, infofile, sizeof(struct infofile)); 
 

Сервер

 bytes = SSL_read(ssl, struct(infofile), sizeof(struct infofile) );
 

Существуют ли другие способы отправки структуры?

Приветствия.

Ответ №1:

Вы не должны этого делать вообще. Структуры данных C не имеют обязательного универсального расположения памяти, одинакового для всех архитектур и платформ. Когда вы сериализуете данные, вам всегда приходится разбивать их на отдельные части (целые числа и последовательности байтов), и, кроме того, вам нужно будет указать размер и порядок (порядковый номер) всех многобайтовых полей, таких как целые числа.

Представьте, что вы находите блок байтов на улице. Откуда вы знаете, что это значит? При сериализации вам нужно опубликовать спецификацию формата, что-то, что вы могли бы применить к найденным байтам и сказать: «это первое целое число», «это последовательность байтов, подсчитанная по ранее прочитанному целому числу» и т. Д. С помощью этой информации соответствующий код десериализации может перестроить внутреннюю структуру данных.

Типичным полем сериализации будет что-то вроде «32-разрядное целое число без знака, с младшим порядком». Это означает, что вам нужно записать байты n amp; 0xFF , (n >> 8) amp; 0xFF , (n >> 16) 0xFF , (n >> 24) amp; 0xFF , и вы читаете обратно buf[0] (buf[1] << 8) (buf[2] << 16) (buf[3] << 24) . Обратите внимание, что вам никогда не нужно будет ничего знать о вашей платформе, а только о проводном формате.

Комментарии:

1. Верно. И я собираюсь искать блоки с расположением байтов на улицах!

2. Я struct все время отправляю (последние 15 лет) через сокет Windows с использованием C на микроконтроллер под управлением C. Никогда не возникало никаких проблем.

3. @0A0D: Это определенно были бы самые потрясающие знаменитые последние слова 🙂

4. Это было бы, если бы я не доверил ему управлять парковочными гаражами с миллионами транзакций по всему миру 🙂

5. @0A0D: Если у вас есть только две фиксированные платформы, можно выяснить, как реализованы языковые конструкции, и использовать это предположение. Это просто не переносимо, нелокально (предположение не задокументировано самим кодом), а расположение структур сопряжено с тонкостями (например, заполнением), что делает их хрупкими и опасными, когда новый стажер хочет добавить пару полей «потому что это так хорошо работало в прошлом». Нет сомнений, что вам это сойдет с рук; я бы просто не стал.

Ответ №2:

За исключением того, что вы, вероятно, имели в виду amp;infofile .