Russian Qt Forum

Qt => Вопросы новичков => Тема начата: CJ1 от Октябрь 24, 2012, 09:44



Название: Передача структуры QTcpSocket
Отправлено: CJ1 от Октябрь 24, 2012, 09:44
Как правильно чтоб без косиков в будущем передавать структуру и принимать ее?


Название: Re: Передача структуры QTcpSocket
Отправлено: lighting от Октябрь 24, 2012, 10:20
думаю поиск по форуму слова сериализация как раз то что тебе нужно.


Название: Re: Передача структуры QTcpSocket
Отправлено: CJ1 от Октябрь 24, 2012, 10:40
Не нашел что хотел. Почему на WinApi все делается просто, а здесь целый геморрой? Для чего это?

Как мне отправить структуру?
Вот сама структура
Код
C++ (Qt)
typedef struct s_tree
{
   int id;
   int id_branch;
   QString name;
   QTreeWidgetItem * item;
 
} s_tree;

теперь я отправляю набор таких структур
Код
C++ (Qt)
               QByteArray Block;
               QDataStream out(&Block,QIODevice::WriteOnly);
               out.setVersion(QDataStream::Qt_4_8);
               out << quint32(0);
               out << QString("Load_Tree");
               out << quint32(db_tree.count());
               for  (int i = 0; i < db_tree.count(); i++)
               {
                   s_tree temp_s_tree = db_tree[i];
                   out.writeRawData(reinterpret_cast<const char*>(&temp_s_tree),sizeof(temp_s_tree));
               }
 
               out.device()->seek(0);
               out << quint32(Block.size() - sizeof(quint32));
               clientSocket->write(Block);
               db_tree.clear();
 


Теперь я их принимаю
Код
C++ (Qt)
           quint32 count_tree;
           in >> count_tree;
 
           for  (int i = 0; i < count_tree; i++)
           {
               s_tree temp_s_tree;
               in.readRawData(reinterpret_cast<char*>(&temp_s_tree), sizeof(temp_s_tree)) ;
               db_tree.push_back(temp_s_tree);
           }


Клиент выдает ошибку! А что не так

Сервер все отправляет!
А клиент не принимает ничего!


Название: Re: Передача структуры QTcpSocket
Отправлено: CJ1 от Октябрь 24, 2012, 10:44
Ладно, вот простоя реализация
Сервер отправляет данные
Код
C++ (Qt)
               QByteArray Block;
               QDataStream out(&Block,QIODevice::WriteOnly);
               out.setVersion(QDataStream::Qt_4_8);
               out << quint32(0);
               out << QString("Load_Tree");
               s_tree temp_s_tree = db_tree[0];
 
               out.writeRawData(reinterpret_cast<const char*>(&temp_s_tree),sizeof(temp_s_tree));
 
               out.device()->seek(0);
               out << quint32(Block.size() - sizeof(quint32));
               clientSocket->write(Block);


Клиент их принемает
Код
C++ (Qt)
       QString BlockType;
       in >> BlockType;
 
       if (BlockType == "Load_Tree")
       {
 
           s_tree temp_s_tree;
           in.readRawData(reinterpret_cast<char*>(&temp_s_tree), sizeof(temp_s_tree)) ;
 
 
       }


Название: Re: Передача структуры QTcpSocket
Отправлено: Igors от Октябрь 24, 2012, 11:00
Как мне отправить структуру?
По-простому говоря, использовать операторы << и >> для каждого поля данных. 

in.readRawData(reinterpret_cast<char*>(&temp_s_tree), sizeof(temp_s_tree)) ;
Так Вы отправляете "дамп памяти", это будет работать для простейших структур, а напр для QString уже нет

typedef struct s_tree
{
   ...
    QTreeWidgetItem * item;
}
А здесь на приемной стороне надо сначала создать item (new) а потом прочитать оператором >>

Как правильно чтоб без косиков в будущем передавать структуру и принимать ее?
Увидев такой вопрос - отвечать как-то не тянет. На хрена здороваться - и так ответят, ошибки в родном языке - не заметят. Поэтому умолкаю


Название: Re: Передача структуры QTcpSocket
Отправлено: CJ1 от Октябрь 24, 2012, 11:02
Тоесть простым словом передавать по очереди!?
пф...... тогда вопрос снят...


Название: Re: Передача структуры QTcpSocket
Отправлено: CJ1 от Октябрь 24, 2012, 11:18
По очереди то оно у меня и так работало