По сути, вы разрабатываете двоичный сетевой протокол, поэтому вы можете использовать существующую библиотеку (например, буферы протокола Google). Если вы все еще хотите создать свой собственный, вы можете добиться разумной переносимости написания необработанных структур, выполнив следующее:
- Упакуйте свои структуры (GCC
__attribute__((packed))
, MSVC #pragma pack
). Это зависит от компилятора.
- Убедитесь, что ваш целочисленный порядковый номер указан правильно (
htons
, htonl
). Это зависит от архитектуры.
- Не используйте указатели для строк (используйте символьные буферы).
- Используйте точные целые размеры C99 (
uint32_t
и т. Д.).
- Убедитесь, что код компилируется только там, где
CHAR_BIT
равно 8, что является наиболее распространенным, или иначе обрабатывает преобразование символьных строк в поток 8-битных октетов. В некоторых средах CHAR_BIT
! = 8, но, как правило, это оборудование специального назначения.
При этом вы можете быть уверены, что получите другой результат на том же конце, если используете то же определение структуры. Однако я не уверен в представлении чисел с плавающей запятой, но я обычно избегаю посылать их.
Еще одна вещь, не связанная с переносимостью, к которой вы, возможно, захотите обратиться, это обратная совместимость путем введения длины в качестве первого поля и / или использования тега версии.