![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
flankerr |
![]() ![]()
Сообщение
#1
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
Берём обычный recv читаеет всё на ура как надо без сбоёв.
Берём Qt сокет и тут начинаються сбои. Лдано бы потсоянно, а то то нормлаьно то начинает лажу вычитывать... У ктонить натыкался на грабли в сокете в Qt 4.3 при обработки больших объёмов данных ??? |
|
|
![]() |
Litkevich Yuriy |
![]()
Сообщение
#2
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
что за лажа-то хоть, опиши подробнее.
|
|
|
fsMark |
![]()
Сообщение
#3
|
![]() Студент ![]() Группа: Участник Сообщений: 97 Регистрация: 23.4.2008 Из: г. Киров Пользователь №: 155 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Лажа бывает когда буффер не заполнился до конца а ты его читать пытаешься..., получаются либо левые данные(мусор).. иногда приложение падать может.
Ты должен либо контролировать количество пришедших данных либо отключить буферизцию. Сообщение отредактировал fsMark - 22.7.2008, 10:25 |
|
|
31512 |
![]()
Сообщение
#4
|
![]() Студент ![]() Группа: Новичок Сообщений: 26 Регистрация: 13.3.2008 Из: Красноярск Пользователь №: 119 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
flankerr |
![]()
Сообщение
#5
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
сокеты не блокируемы через сигналы..
привязываю к сигналу readyRead() свой обработчик там проверяю bytesAvailable() если там есть нужное мне число байт то считываю read() если там меньшее число ьбайт тогда выходу из обработчки и жду следующего сигнала. Через н-ое время (всегдя по разному) вместо валидных данных начинаю считывать лажу. Т.е предположим мне надо считать два байта, я получаю readyRead() захожу в свой обработчик проверяю bytesAvailable() на наличие этих двух байт, потом делаю read() проверяю что read() вернул мне правельно число прочитаных байт а вот содержание данных - фуфел. хотя размер "пакета" данных не велик 60-200 байт но общий объём весьма ощутимый. Сообщение отредактировал flankerr - 23.7.2008, 12:57 |
|
|
CodeHunter |
![]()
Сообщение
#6
|
![]() Студент ![]() Группа: Участник Сообщений: 33 Регистрация: 26.8.2010 Пользователь №: 1982 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
BRE |
![]()
Сообщение
#7
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Сначала надо отправлять размер данных, а потом считывать этот размер и корректно читать из буфера Что значит надо? А если протокол не подразумевает отправку размера данных или отправитель вообще не может в начале отправки определить сколько он будет отправлять? В ручную бить трафик на блоки и добавлять информацию о размере? Для чего увеличивать объем передаваемых данных, если tcp стек это и так делает? Достаточно корректно обрабатывать поступающие данные. А отправка размера блока упрощает получение блока, но совершенно не обязательна. |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 16.6.2025, 5:51 |