Russian Qt Forum
Май 03, 2024, 07:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: $РЕШЕНО$ "Слипание" кадров  (Прочитано 4350 раз)
Inhibitor
Гость
« : Октябрь 28, 2015, 19:21 »

Добрый день.

Помогите, пожалуйста, разъяснить один вопрос. Ситуация примерно такова: приложение через QTcpSocket подключается к девайсу, после чего выкачивает с девайса информацию в виде файла. Проблема заключается в следующем: девайс выдает информацию стройными красивыми кадрами по 1460 байт каждый (мониторил через Wireshark), а сокет (монитроил через метод bytesAvailable()) выдает информацию то по 1460 байт, то по 2920 байт (1460 * 2). Подскажите, возможно ли избавиться от такого "слипанияв" кадров на стороне сокета?
« Последнее редактирование: Октябрь 29, 2015, 10:06 от Inhibitor » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Октябрь 28, 2015, 20:03 »

можно но не нужно. см. в сторону Алгоритм Нейгла

UPD: А хотя, если смотреть на QTcpSocket - то это маловероятно. Может быть поиграться с setsockopt(TCP_NODELAY)
« Последнее редактирование: Октябрь 28, 2015, 20:06 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #2 : Октябрь 28, 2015, 20:26 »

Подскажите, возможно ли избавиться от такого "слипанияв" кадров на стороне сокета?
Вычитывайте быстрее данные из сокета. Если вычитывать еще медленней, то будет собираться и по 3 x 1460 и по 4. Улыбающийся
Записан
Dimas
Чайник
*
Offline Offline

Сообщений: 50



Просмотр профиля
« Ответ #3 : Октябрь 29, 2015, 08:53 »

Мне помогло от слипания кадров отключение в сокете QTcpSocket алгоритмов Нейгла.
Код:
socket.socketOption(QAbstractSocket::LowDelayOption);
Записан

qt 4.8.6, qt 5.12.4
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #4 : Октябрь 29, 2015, 09:04 »

1460 это MTU в локалке
никто и не гарантирует размер принятых данных в разных конфигурациях сетей
программа должна быть готова обработать любой размер пакета данных


Записан
Inhibitor
Гость
« Ответ #5 : Октябрь 29, 2015, 10:06 »

Dimas, kuzulis, спасибо! Улыбающийся

Действительно отключение Нейгла помогло.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 23.