crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QTcpSocket - ошибки в работе
flankerr
  опции профиля:
сообщение 21.7.2008, 17:50
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


Берём обычный recv читаеет всё на ура как надо без сбоёв.
Берём Qt сокет и тут начинаються сбои. Лдано бы потсоянно, а то то нормлаьно то начинает лажу вычитывать...

У ктонить натыкался на грабли в сокете в Qt 4.3 при обработки больших объёмов данных ???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.7.2008, 17:53
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


что за лажа-то хоть, опиши подробнее.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fsMark
  опции профиля:
сообщение 22.7.2008, 10:24
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 23.4.2008
Из: г. Киров
Пользователь №: 155

Спасибо сказали: 10 раз(а)




Репутация:   1  


Лажа бывает когда буффер не заполнился до конца а ты его читать пытаешься..., получаются либо левые данные(мусор).. иногда приложение падать может.
Ты должен либо контролировать количество пришедших данных либо отключить буферизцию.

Сообщение отредактировал fsMark - 22.7.2008, 10:25
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
31512
  опции профиля:
сообщение 23.7.2008, 5:55
Сообщение #4


Студент
*

Группа: Новичок
Сообщений: 26
Регистрация: 13.3.2008
Из: Красноярск
Пользователь №: 119

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(flankerr @ 21.7.2008, 22:50) *

Эта... А ты какой режим используешь? Сокеты бывают блокируюшие и неблокирующие. У меня с сокетами никаких проблем всё работает отлично.

Сообщение отредактировал 31512 - 23.7.2008, 6:01
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 23.7.2008, 12:53
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


сокеты не блокируемы через сигналы..

привязываю к сигналу readyRead() свой обработчик там проверяю bytesAvailable() если там есть нужное мне число байт то считываю read() если там меньшее число ьбайт тогда выходу из обработчки и жду следующего сигнала.

Через н-ое время (всегдя по разному) вместо валидных данных начинаю считывать лажу.
Т.е предположим мне надо считать два байта, я получаю readyRead() захожу в свой обработчик проверяю bytesAvailable() на наличие этих двух байт, потом делаю read() проверяю что read() вернул мне правельно число прочитаных байт а вот содержание данных - фуфел.

хотя размер "пакета" данных не велик 60-200 байт но общий объём весьма ощутимый.

Сообщение отредактировал flankerr - 23.7.2008, 12:57
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
CodeHunter
  опции профиля:
сообщение 23.9.2010, 12:26
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 33
Регистрация: 26.8.2010
Пользователь №: 1982

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(fsMark @ 22.7.2008, 10:24) *
Лажа бывает когда буффер не заполнился до конца а ты его читать пытаешься...,



Сначала надо отправлять размер данных, а потом считывать этот размер и корректно читать из буфера
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 24.9.2010, 7:05
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(CodeHunter @ 23.9.2010, 13:26) *
Сначала надо отправлять размер данных, а потом считывать этот размер и корректно читать из буфера

Что значит надо? А если протокол не подразумевает отправку размера данных или отправитель вообще не может в начале отправки определить сколько он будет отправлять?
В ручную бить трафик на блоки и добавлять информацию о размере? Для чего увеличивать объем передаваемых данных, если tcp стек это и так делает?
Достаточно корректно обрабатывать поступающие данные.

А отправка размера блока упрощает получение блока, но совершенно не обязательна.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 17:17