QTcpSocket - ошибки в работе |
Здравствуйте, гость ( Вход | Регистрация )
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 |
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 |
|
|
|
BRE |
24.9.2010, 7:05
Сообщение
#7
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Сначала надо отправлять размер данных, а потом считывать этот размер и корректно читать из буфера Что значит надо? А если протокол не подразумевает отправку размера данных или отправитель вообще не может в начале отправки определить сколько он будет отправлять? В ручную бить трафик на блоки и добавлять информацию о размере? Для чего увеличивать объем передаваемых данных, если tcp стек это и так делает? Достаточно корректно обрабатывать поступающие данные. А отправка размера блока упрощает получение блока, но совершенно не обязательна. |
|
|
Текстовая версия | Сейчас: 3.1.2025, 2:40 |