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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Очистка буферов QTcpSocket  (Прочитано 7855 раз)
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« : Сентябрь 04, 2017, 16:41 »

Коллеги,
в QSerialPort есть метод clear() для очистки буферов. А в QTcpSocket есть ли что-нибудь подобное?
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Bepec
Гость
« Ответ #1 : Сентябрь 04, 2017, 21:11 »

В смысле для очистки? Просто прочитайте данные в никуда.
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #2 : Сентябрь 04, 2017, 21:33 »

Это что касается данных, поступающих из сокета. А буфер данных, передаваемых в сокет, как очистить?
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Bepec
Гость
« Ответ #3 : Сентябрь 04, 2017, 22:03 »

flush?
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #4 : Сентябрь 05, 2017, 16:41 »

flush?

flush выкидывает данные в сеть, но не очищает имеющиеся без передачи
Записан
Bepec
Гость
« Ответ #5 : Сентябрь 05, 2017, 16:45 »

Эээ... Вы не путайте удалить все данные и очистить буферы.
Сам смысл "буферов" в сохранении данных. Врядли имеется программист с шизофренией, который одной рукой посылает данные а потом их удаляет.
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #6 : Сентябрь 05, 2017, 18:31 »

Сам смысл "буферов" в сохранении данных. Врядли имеется программист с шизофренией, который одной рукой посылает данные а потом их удаляет.
Есть! Но шизофрения тут ни при чем, все зависит от задачи. Например, когда реализуется прикладной протокол, то перед началом очередной транзакции, нужно быть уверенным, что не осталось никаких хвостов от предыдущей. Например, в QModbusRtuSerialMasterPrivate таких фрагментов
Код:
            m_state = Schedule; // reschedule, even if empty
            m_serialPort->clear(QSerialPort::AllDirections);
            QTimer::singleShot(m_interFrameDelayMilliseconds, [this]() { processQueue(); });
четыре штуки. Я этот класс перепёр на TCP соединение, вот и ищу замену Подмигивающий
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Bepec
Гость
« Ответ #7 : Сентябрь 05, 2017, 19:57 »

Дык флушьте и читайте. Сделав readAll flush вы гарантируете что у вас обрезков нет. Но, соответственно, вам нужно флагами или как контролировать самому отправку.

Ибо нет смысла очищать буфер, если вы же туда через мс запишите что-либо.

PS флуш очищает буфер, заканчивая пересылку данных, которые ВЫ оправили.
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #8 : Сентябрь 05, 2017, 20:23 »

Дык флушьте и читайте.
Насчет readAll - все правильно. А flush делать нельзя - этот мусор попрет в устройства, и что в ответ получим - неизвестно.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Bepec
Гость
« Ответ #9 : Сентябрь 05, 2017, 20:25 »

Там не мусор.. В буфере отправки лежат пакеты, которые ещё не отправлены в сеть. То, что вы туда write, но ещё не успело отправиться.
И flush вы их принудительно отсылаете.
Т.е. если бы вы просто чистили буфер отправки, то отправилось бы полпакета, а вторую половину вы бы затёрли Веселый и у вас чур чыгыдык наступил бы в канале Веселый Ну или команды потерялись
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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