![]() |
|
![]() ![]() ![]() |
|
newbie2009 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 8.2.2009 Репутация: нет Всего: нет |
Вопрос такой. Если ли какой-то сигнал, к-ый говорит о том, что пакет полностью передан,так как пакет может передаваться и по частям.
Я в доках нашел сигнал readChannelFinished(), но что если я дальге делаю вот так, то не хочет работать: connect(_sok,SIGNAL(readChannelFinished()),this,SLOT(parsePacket())); connect(_sok, SIGNAL(readyRead()), this, SLOT(onSokReadyRead())); в onSokReadyRead() - я собираю по частям пакет... Или все равно придется передавать вначале число сколько байт я буду передавать, а потом уже исходя из этого считывать? или есть все таки сигнал, к-ый сгенерируется, когда ВЕСЬ пакет будет передан? |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
О размере "пакета" знаете только Вы. Для Tcp/ip нет понятия "пакета". Передавать в начале длину пакета и ожидать принятое кол-во байт в readyRead() - совершенно стандартное решение, а для чего нужен сигнал readChannelFinished() - честно говоря не знаю )))
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
newbie2009 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 8.2.2009 Репутация: нет Всего: нет |
Не могу понять почему размер я получаю нормально, ветки else срабатывает когда надо, а в переменную блок не заносяться данные вообще. переменную block ( QByteArray ) ? И как мне тогда считать весь мой пакет? Это сообщение отредактировал(а) newbie2009 - 10.1.2012, 11:37 |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Трудно сказать. Вроде ошибок не видно... Покажи, как отправляешь данные.
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
newbie2009 |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 8.2.2009 Репутация: нет Всего: нет |
Вот так я отсылаю...
Я конечно понимаю что можно все побайтово, т.е. вот так:
Но это же не вариант так делать, хотя так оно и работает!=( Это сообщение отредактировал(а) newbie2009 - 10.1.2012, 13:06 |
||||
|
|||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Ты записываешь ф-цией сокета write, а считываешь оператором >> QDataStream'а. Записывай и считывай в/из сокета функциями write/read и не используй QDataStream вообще и будет счастье)))
P.S. Почитай эту тему про DataStream'ы. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
newbie2009 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 8.2.2009 Репутация: нет Всего: нет |
QDataStream в этот раз мне нужен, что отдельно еще самому не пихать размер пакета, а так он сам подсчитает и перешлет, а так заиспользова _sok->readAll() все работает правильно.
Спасибо! |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
newbie2009, нехорошее решение, т.к. в следующей версии Qt они могут добавить после размера версию (к примеру), и у тебя всё поедет. Не ленись, посчитай размер (тем более, что это несложно - byteArray.size() ))) и передай его ручками.
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
_GRIN_ |
|
|||
![]() одинокий падаван ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 18.11.2007 Где: Калуга Репутация: 6 Всего: 7 |
Ну в принципе кьют предлагает решение: http://developer.qt.nokia.com/doc/qt-4.8/q...html#versioning А вообще использование потоков очень удобно, но (имхо) всегда надо версию ставить (http://developer.qt.nokia.com/doc/qt-4.8/qdatastream.html#setVersion), что бы не зависить от версии СДК, под которой собираешь. Хотя способ с указание размера в ручную конечно же более надёжен =) -------------------- Дорогу осилит идущий |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
да, но нужно не забыть перекомпилировать и передающую и принимающую сторону. А это не всегда возможно. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
_GRIN_ |
|
|||
![]() одинокий падаван ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 18.11.2007 Где: Калуга Репутация: 6 Всего: 7 |
зачем? если одна из сторон была написана более рано (допустип передающая) и она указал у себя при создании потока версию (допустим Qt_4_5) то при написании (переписывании) принимающей стороны (допустим под сдк 4.8) нужно просто при создании считывающего потока указать версию передающей стороны - т.е. Qt_4_5 И более старый код перекомпилировать не надо! -------------------- Дорогу осилит идущий |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |