директива для gcc
создается структура какая-то, предположим
Код:
typedef struct{...}HEAD
#pragma pack(1) перед отправкой поставь.
И еще, если ты так данные по сети прям структурами - надо быть крайне осторожными. Потому как кроме это проблемы с выравниванием со временем легко проявляться проблемы с разной размерностью типов данных и порядком байт в них на разных аппаратных платформах или даже ОС.
и нсчет #pragma pack(push, 1 ) #pragma pack(pop) на сколько я вычитал в юнихе gcc не разрешает такой синтаксис(имеется ввиду push pop)...
Цитата: qbikk
почитал в гугле, говорят что лучше в буфер все скидывать что хочешь передать и потом уже буфер передавать... это будет решать проблему?
Смотря в каком контексте это советуют. ВОзможно советуют поотдельности сереализовать/десериализовать туда в нужном формате все поля структуры. А потом уже буфером отправлять/принимать. Чтобы избежать всех проблем со структурами. Или может быть речь шла о буферизации, чтобы ускорить работу с передачей данных и отправлять их уже готовыми большими порциями.
тогда еще вопросик появился: как правильно задавать размер буфера? ну т.е. можно просто число поставить, но это вроде не правильно, так как сложно сопровождать и править проект... sizeof(Head) тоже бессмыслено так как опять же выравнивание, а еслси использовать pack то какой смысл в буфере... можно продефайнить мол #define SIZE_OF_STRUCT_HEAD... интересно как делают грамотные люди)
В Qt есть замечательный класс для серелизации отправляемых/принимаемых данных. QDataStream называется. Можно в его исходниках поковыряться.
В конце концов структура и размер вашего пакета специфицируется протоколом и по идее не зависит от языка программирования. Так что привязывать его к размеру структуры смысла нет.
язык Си... платформа семейство unix/linux... ну вообщем понятно, буду править сейчас)) спасибо большое за помощь, получил много полезной информации)
Цитата: oxotnik333
Это называется выравнивание. По дефолту вроде по границе 4-х байт.
#pragma pack(1) перед отправкой поставь.
#pragma pack(1) перед отправкой поставь.
Какая прагма? Это ж gcc. Тут, вроде как, __attribute__ используется.
Цитата: kisssko
Какая прагма? Это ж gcc. Тут, вроде как, __attribute__ используется.
Ну как бэ вот: http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html
Притом прагма - стандартное средство передачи компилятору специфичных для него параметров, закрепленное в стандарте. А __attribute__ - расширение gcc.