Russian Qt Forum

Qt => Работа с сетью => Тема начата: Inhibitor от Октябрь 28, 2015, 19:21



Название: $РЕШЕНО$ "Слипание" кадров
Отправлено: Inhibitor от Октябрь 28, 2015, 19:21
Добрый день.

Помогите, пожалуйста, разъяснить один вопрос. Ситуация примерно такова: приложение через QTcpSocket подключается к девайсу, после чего выкачивает с девайса информацию в виде файла. Проблема заключается в следующем: девайс выдает информацию стройными красивыми кадрами по 1460 байт каждый (мониторил через Wireshark), а сокет (монитроил через метод bytesAvailable()) выдает информацию то по 1460 байт, то по 2920 байт (1460 * 2). Подскажите, возможно ли избавиться от такого "слипанияв" кадров на стороне сокета?


Название: Re: "Слипание" кадров
Отправлено: kuzulis от Октябрь 28, 2015, 20:03
можно но не нужно. см. в сторону Алгоритм Нейгла (https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9D%D0%B5%D0%B9%D0%B3%D0%BB%D0%B0)

UPD: А хотя, если смотреть на QTcpSocket - то это маловероятно. Может быть поиграться с setsockopt(TCP_NODELAY)


Название: Re: "Слипание" кадров
Отправлено: Old от Октябрь 28, 2015, 20:26
Подскажите, возможно ли избавиться от такого "слипанияв" кадров на стороне сокета?
Вычитывайте быстрее данные из сокета. Если вычитывать еще медленней, то будет собираться и по 3 x 1460 и по 4. :)


Название: Re: "Слипание" кадров
Отправлено: Dimas от Октябрь 29, 2015, 08:53
Мне помогло от слипания кадров отключение в сокете QTcpSocket алгоритмов Нейгла.
Код:
socket.socketOption(QAbstractSocket::LowDelayOption);


Название: Re: "Слипание" кадров
Отправлено: qate от Октябрь 29, 2015, 09:04
1460 это MTU в локалке
никто и не гарантирует размер принятых данных в разных конфигурациях сетей
программа должна быть готова обработать любой размер пакета данных




Название: Re: "Слипание" кадров
Отправлено: Inhibitor от Октябрь 29, 2015, 10:06
Dimas, kuzulis, спасибо! :)

Действительно отключение Нейгла помогло.