Russian Qt Forum

Qt => Работа с сетью => Тема начата: V1rus от Октябрь 28, 2009, 17:59



Название: [QT3] передача структуры
Отправлено: V1rus от Октябрь 28, 2009, 17:59
Всем доброе время суток. Вопрос следующего плана. Надо передать структуру через сокет. Я передавал строки, цифры, байты, всё было ок, а вот со структурой борода какая то. Структуру копирую в QByteArray(предварительно сделав ему resize) а его уже передаю, на принимающей стороне алгоритм обратный, но в стуктуре нулевые или пустые строки. При том если тестить это на локальной машине(connectToHost("localhost", port)) то данный передаются нормально, если к другой машине коннектишся то всё плохо. Могу предположить что это из за выравнивания структуры компилятором, но как с этим бороться не знаю, такие дерективы как __unaligment не работают почему то. Подскажите кто сталкивался или просто знает как корректно ее передать.


Название: Re: [QT3] передача структуры
Отправлено: Igors от Октябрь 28, 2009, 19:06
Относительно выранивания
Код:
#pragma pack(push, 4)      // выровнять на 4 байта

struct MyStruct {
....
};

#pragma pack(pop)          // восстановить предыдущее выравнивание

Но для 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):
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;

Непонятно, почему обязательно inline? И зачем обязательно регистрировать если планируется явное объявление YourStruct и прямой вызов оператора <<, без использования QVariant и QMetaType? Хотя конечно, если зарегистрировать - хуже не станет :)


Название: 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
можете, но скорее всего свою структуру объявляете в заголовочном файле и там же захотите реализовать операторы << >>