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