Russian Qt Forum
Ноябрь 25, 2024, 12:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача структуры QTcpSocket  (Прочитано 3597 раз)
CJ1
Гость
« : Октябрь 24, 2012, 09:44 »

Как правильно чтоб без косиков в будущем передавать структуру и принимать ее?
Записан
lighting
Гость
« Ответ #1 : Октябрь 24, 2012, 10:20 »

думаю поиск по форуму слова сериализация как раз то что тебе нужно.
Записан
CJ1
Гость
« Ответ #2 : Октябрь 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);
           }


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

Сервер все отправляет!
А клиент не принимает ничего!
Записан
CJ1
Гость
« Ответ #3 : Октябрь 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)) ;
 
 
       }
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Октябрь 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) а потом прочитать оператором >>

Как правильно чтоб без косиков в будущем передавать структуру и принимать ее?
Увидев такой вопрос - отвечать как-то не тянет. На хрена здороваться - и так ответят, ошибки в родном языке - не заметят. Поэтому умолкаю
Записан
CJ1
Гость
« Ответ #5 : Октябрь 24, 2012, 11:02 »

Тоесть простым словом передавать по очереди!?
пф...... тогда вопрос снят...
Записан
CJ1
Гость
« Ответ #6 : Октябрь 24, 2012, 11:18 »

По очереди то оно у меня и так работало
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.431 секунд. Запросов: 23.