Название: [QT3] передача структуры Отправлено: V1rus от Октябрь 28, 2009, 17:59 Всем доброе время суток. Вопрос следующего плана. Надо передать структуру через сокет. Я передавал строки, цифры, байты, всё было ок, а вот со структурой борода какая то. Структуру копирую в QByteArray(предварительно сделав ему resize) а его уже передаю, на принимающей стороне алгоритм обратный, но в стуктуре нулевые или пустые строки. При том если тестить это на локальной машине(connectToHost("localhost", port)) то данный передаются нормально, если к другой машине коннектишся то всё плохо. Могу предположить что это из за выравнивания структуры компилятором, но как с этим бороться не знаю, такие дерективы как __unaligment не работают почему то. Подскажите кто сталкивался или просто знает как корректно ее передать.
Название: Re: [QT3] передача структуры Отправлено: Igors от Октябрь 28, 2009, 19:06 Относительно выранивания
Код: #pragma pack(push, 4) // выровнять на 4 байта Но для Qt объектов это поможет "как мертвому припарка" :) Пишите/читайте в/из потока с помощью операторов << и >> Название: Re: [QT3] передача структуры Отправлено: Arieserg от Октябрь 29, 2009, 15:58 реализуйте операторы (должны быть inline):
QDataStream & operator>> (QDataStream & s, YourStruct &y) QDataStream & operator<< (QDataStream & s, const YourStruct &y) только незабудьте задекларировать свою структуру: qRegisterMetaType<YourStruct >(); qRegisterMetaStreamOperators<YourStruct >("YourStruct"); затем передавайте свою структуру в поток и считуйте: QTcpSocket * client; client->connectToHost(hostName,portNum); QDataStream out(client); YourStruct struct; out<<struct; Название: Re: [QT3] передача структуры Отправлено: Igors от Октябрь 29, 2009, 17:06 реализуйте операторы (должны быть inline): Непонятно, почему обязательно inline? И зачем обязательно регистрировать если планируется явное объявление YourStruct и прямой вызов оператора <<, без использования QVariant и QMetaType? Хотя конечно, если зарегистрировать - хуже не станет :)QDataStream & operator>> (QDataStream & s, YourStruct &y) QDataStream & operator<< (QDataStream & s, const YourStruct &y) только незабудьте задекларировать свою структуру: qRegisterMetaType<YourStruct >(); qRegisterMetaStreamOperators<YourStruct >("YourStruct"); затем передавайте свою структуру в поток и считуйте: QTcpSocket * client; client->connectToHost(hostName,portNum); QDataStream out(client); YourStruct struct; out<<struct; Название: Re: [QT3] передача структуры Отправлено: Arieserg от Октябрь 29, 2009, 19:17 inline потому что реализация вне класса
регистрировать не обязательно если не будете пихать структуру в QVariant или в Сигналы\Слоты Название: Re: [QT3] передача структуры Отправлено: Igors от Октябрь 29, 2009, 19:27 inline потому что реализация вне класса Ну и что? Почему я не могу в .h файле написать прототипКод: QDataStream & operator>> (QDataStream & s, YourStruct &y); А затем написать тело в одном из .cpp Код: QDataStream & operator>> (QDataStream & s, YourStruct &y) Название: Re: [QT3] передача структуры Отправлено: Arieserg от Октябрь 29, 2009, 23:53 можете, но скорее всего свою структуру объявляете в заголовочном файле и там же захотите реализовать операторы << >>
|