Здравствуйте,Пишу небольшой демон на си++, который через локальные сокеты общается с пхп скриптом. На данный момент общаются они в текстовом режиме и приходится в си демоне числовые типы double, int преобразовывать в строки:
char buf[33];
sprintf(buf,"%d",int_total);
std::string total_str = buf;
bzero(buf, 33);все бы ничего, но данных куча. очень неудобно. хотелось бы в сокет бинарные данные посылать и получать (лучше структуру), чтобы в php части можно было бы из бинарной последовательности сформировать такую же структуру или просто такие же переменные.
не могу найти информации с примерами по этому вопросу. не понимаю:
- как считать данные после отправки? пример ищу, пусть даже если общаются две си++ программы, а еще лучше си<->сокет<->php... в php вроде бы unpack нужно использовать?
- необходимы ли какие-то преобразования до отправки? можно ли int,double или структуру присвоить к std::string и эту строку отправить через бинарный сокет?
- как получить в php структуру?пригодится любая информация по этим вопросам, желательно на русском.. если с примерами, то можно даже на англ.
пс. в гугл не посылать, разжеванной информации нет, а упоминания бинарных данных свозятся к тому, что считать файл или картинку и отправить, но не конкретно структуру данных. чтобы потом получить эти данные в переменные...
спасибо!
да, и также бинарные данные нужны для сериализации. с ней тоже не совсем понятно, допустим, с чьей-нибудь помощью научусь писать и передавать простые типы через сокет (там структура данных одна и таже, при приеме/передаче обе программы заранее знаю размеры и последовательность данных, т.е. как-то по битам могут считать, но что при сериализации? вдруг от версии программы к версии изменятся типы или их станет больше в структуре чем было? тогда структура уже не годная и не может быть считана?
как быть если в структуре есть std::string, у неё ведь переменый размер.. как такая структура может быть сериализована?
Сериализация в бинарный объект имеет смысл в пределах одного языка. То есть когда клиент и сервер написаны на одном языке и знают как работать с такими объектами. В случае разных языков получается грязный хак с одной из сторон. Смысла в таком немного, но если хотите, то флаг и исходники php вам в руки.
Если же делать по уму, то стоит использовать какой-то промежуточный формат, понимаемый(в смысле есть либы/модули преобразования) обоими языками, например XML/YAML/JSON. В этом случае смена языка для клиента или сервера не заставит переписывать второй компонент.
>Сериализация в бинарный объект имеет смысл в пределах одного языка. То есть
>когда клиент и сервер написаны на одном языке и знают как
>работать с такими объектами. В случае разных языков получается грязный хак
>с одной из сторон. Смысла в таком немного, но если хотите,
>то флаг и исходники php вам в руки.
>Если же делать по уму, то стоит использовать какой-то промежуточный формат, понимаемый(в
>смысле есть либы/модули преобразования) обоими языками, например XML/YAML/JSON. В этом случае
>смена языка для клиента или сервера не заставит переписывать второй компонент.
>спасибо, понятно, значит для обмена данными между пхп частью и си++ остается старый, геморный, текстовый вариант обмена.
а как быть с СЕРИАЛИЗАЦИЕЙ если именно речь идет о том, чтобы сериализовать данный из си++ демона в бинарный файл и потом в него же их востановить? может есть какие-то статьи хорошие или примеры в букмарках у кого-нибудь по работе с бинарными данными?
http://www.boost.org/doc/libs/1_38_0/libs/serialization/doc/....По поводу "старый, геморный, текстовый вариант обмена", сдается неверной дорогой идете, товарищ. Либо не знаете библиотек для работы с текстом, либо помешаны на оптимизации по объему в ущерб всему остальному.