Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QTcpSocket и сигнал завершения передачи данных 
:(
    Опции темы
newbie2009
Дата 9.1.2012, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 8.2.2009

Репутация: нет
Всего: нет



Вопрос такой. Если ли какой-то сигнал, к-ый говорит о том, что пакет полностью передан,так как пакет может передаваться и по частям.
Я в доках нашел сигнал readChannelFinished(), но что если я дальге делаю вот так, то не хочет работать:

 connect(_sok,SIGNAL(readChannelFinished()),this,SLOT(parsePacket()));
 connect(_sok, SIGNAL(readyRead()), this, SLOT(onSokReadyRead()));

в onSokReadyRead() - я собираю по частям пакет...

Или все равно придется передавать вначале число сколько байт я буду передавать, а потом уже исходя из этого считывать? или есть все таки сигнал, к-ый сгенерируется, когда ВЕСЬ пакет будет передан?
PM MAIL   Вверх
borisbn
Дата 10.1.2012, 06:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



О размере "пакета" знаете только Вы. Для Tcp/ip нет понятия "пакета". Передавать в начале длину пакета и ожидать принятое кол-во байт в readyRead() - совершенно стандартное решение, а для чего нужен сигнал readChannelFinished() - честно говоря не знаю ))) 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
newbie2009
Дата 10.1.2012, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 8.2.2009

Репутация: нет
Всего: нет



Код

  QDataStream in(_sok);
    if ( isFirstPacket ) {
        if ( _sok->bytesAvailable() < (int)sizeof(quint32) ) {
            return;
        }
        in >> packet_size;
        qDebug() << "packet size = " << packet_size;
        isFirstPacket = false;
    }

    if (_sok->bytesAvailable() < packet_size ) {
        qDebug() << "bytes avaible: " << _sok->bytesAvailable();
        return;
    }
    else {
        isFirstPacket = true;
        in >> block;
        qDebug() << block.size();
    }

Не могу понять почему размер я получаю нормально, ветки else срабатывает когда надо, а в переменную блок не заносяться данные вообще. переменную block ( QByteArray ) ? И как мне тогда считать весь мой пакет?

Это сообщение отредактировал(а) newbie2009 - 10.1.2012, 11:37
PM MAIL   Вверх
borisbn
Дата 10.1.2012, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Трудно сказать. Вроде ошибок не видно... Покажи, как отправляешь данные.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
newbie2009
Дата 10.1.2012, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 8.2.2009

Репутация: нет
Всего: нет



Вот так я отсылаю...
Код

QByteArray ba_file;
QDataStream out(&ba_file, QIODevice::WriteOnly);
out << xmlDoc->toByteArray();
qDebug() << client->write(ba_file);



Я конечно понимаю что можно все побайтово, т.е. вот так:
Код


    QDataStream in(_sok);
    if ( isFirstPacket ) {
        if ( _sok->bytesAvailable() < (int)sizeof(quint32) ) {
            return;
        }
        in >> packet_size;
        qDebug() << "packet size = " << packet_size;
        isFirstPacket = false;
    }

    if (_sok->bytesAvailable() < packet_size ) {
        qDebug() << "bytes avaible: " << _sok->bytesAvailable();
        return;
    }
    else {
        isFirstPacket = true;

// -----------------------------------------------------------------------
        qint8 t;
        for(int i = 0; i < packet_size; i++) {
            in >> t;
            block.append(t);
        }
        qDebug() << block.size();
// -----------------------------------------------------------------------

        emit startParse();
    }


Но это же не вариант так делать, хотя так оно и работает!=(

Это сообщение отредактировал(а) newbie2009 - 10.1.2012, 13:06
PM MAIL   Вверх
borisbn
Дата 10.1.2012, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Ты записываешь ф-цией сокета write, а считываешь оператором >> QDataStream'а. Записывай и считывай в/из сокета функциями write/read и не используй QDataStream вообще и будет счастье)))

P.S. Почитай эту тему про DataStream'ы.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
newbie2009
Дата 10.1.2012, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 8.2.2009

Репутация: нет
Всего: нет



QDataStream в этот раз мне нужен, что отдельно еще самому не пихать размер пакета, а так он сам подсчитает и перешлет, а так заиспользова _sok->readAll() все работает правильно.
Спасибо!
PM MAIL   Вверх
borisbn
Дата 10.1.2012, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



newbie2009, нехорошее решение, т.к. в следующей версии Qt они могут добавить после размера версию (к примеру), и у тебя всё поедет. Не ленись, посчитай размер (тем более, что это несложно - byteArray.size() ))) и передай его ручками.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
_GRIN_
Дата 11.1.2012, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



Цитата(borisbn @  10.1.2012,  12:02 Найти цитируемый пост)
newbie2009, нехорошее решение, т.к. в следующей версии Qt они могут добавить после размера версию (к примеру), и у тебя всё поедет. 


Ну в принципе кьют предлагает решение: http://developer.qt.nokia.com/doc/qt-4.8/q...html#versioning
А вообще использование потоков очень удобно, но (имхо) всегда надо версию ставить (http://developer.qt.nokia.com/doc/qt-4.8/qdatastream.html#setVersion), что бы не зависить от версии СДК, под которой собираешь.

Хотя способ с указание размера в ручную конечно же более надёжен =)




--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
borisbn
Дата 11.1.2012, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(_GRIN_ @  11.1.2012,  08:38 Найти цитируемый пост)
Ну в принципе кьют предлагает решение

да, но нужно не забыть перекомпилировать и передающую и принимающую сторону. А это не всегда возможно.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
_GRIN_
Дата 12.1.2012, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



Цитата(borisbn @  11.1.2012,  08:18 Найти цитируемый пост)
да, но нужно не забыть перекомпилировать и передающую и принимающую сторону.

зачем?
 если одна из сторон была написана более рано (допустип передающая) и она указал у себя при создании потока версию (допустим Qt_4_5)
то при написании (переписывании) принимающей стороны (допустим под сдк 4.8) нужно просто при создании считывающего потока указать версию передающей стороны - т.е. Qt_4_5
И более старый код перекомпилировать не надо!



--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1103 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.