Вы можете, если клиент и сервер выложили структуру точно так же, что означает, что поля имеют одинаковый размер с одинаковым заполнением. Например, если у вас есть long
в вашей структуре, это может быть 32 бита на одном компьютере и 64 бита на другом, и в этом случае структура будет получена неправильно.
В вашем случае, если клиент и сервер всегда будут в очень похожих реализациях C (например, если это только код, который вы используете, чтобы изучить некоторые базовые понятия или если по какой-то другой причине вы знаете ваш код будет работать только в вашей текущей версии OSX), тогда вам, возможно, удастся с ним справиться. Просто помните, что ваш код не обязательно будет работать должным образом на других платформах, и что есть еще много работы, прежде чем он станет подходящим для использования в большинстве ситуаций реального мира.
Для большинства клиент-серверных приложений это означает, что ответ заключается в том, что вы не можете делать это вообще. Фактически вы определяете сообщение с точки зрения количества отправленных байтов, какого порядка, что они означают и т. Д. Затем на каждом конце вы делаете что-то конкретное для платформы, чтобы убедиться, что структура, которую вы используете, имеет точно необходимый макет. Тем не менее, возможно, вам придется выполнить некоторую замену байтов, если вы отправляете целочисленные члены структуры little-endian, а затем вы хотите, чтобы ваш код работал на машине большого конца. Существуют так называемые форматы обмена данными, такие как XML, json и буферы протокола Google, так что вам не нужно делать это неудобно.
[Изменить: также помните, конечно, что некоторые элементы структуры никогда не могут быть отправлены по кабелю. Например, если ваша структура имеет указатель в ней, тогда адрес относится к памяти на отправляющей машине и бесполезен на принимающей стороне. Извините, если это уже очевидно для вас, но это, безусловно, не очевидно для всех, когда они только начинаются с C].
Спасибо всем за информативные ответы! – o01