Russian Qt Forum

Qt => Работа с сетью => Тема начата: sergek от Сентябрь 04, 2017, 16:41



Название: Очистка буферов QTcpSocket
Отправлено: sergek от Сентябрь 04, 2017, 16:41
Коллеги,
в QSerialPort есть метод clear() для очистки буферов. А в QTcpSocket есть ли что-нибудь подобное?


Название: Re: Очистка буферов QTcpSocket
Отправлено: Bepec от Сентябрь 04, 2017, 21:11
В смысле для очистки? Просто прочитайте данные в никуда.


Название: Re: Очистка буферов QTcpSocket
Отправлено: sergek от Сентябрь 04, 2017, 21:33
Это что касается данных, поступающих из сокета. А буфер данных, передаваемых в сокет, как очистить?


Название: Re: Очистка буферов QTcpSocket
Отправлено: Bepec от Сентябрь 04, 2017, 22:03
flush?


Название: Re: Очистка буферов QTcpSocket
Отправлено: qate от Сентябрь 05, 2017, 16:41
flush?

flush выкидывает данные в сеть, но не очищает имеющиеся без передачи


Название: Re: Очистка буферов QTcpSocket
Отправлено: Bepec от Сентябрь 05, 2017, 16:45
Эээ... Вы не путайте удалить все данные и очистить буферы.
Сам смысл "буферов" в сохранении данных. Врядли имеется программист с шизофренией, который одной рукой посылает данные а потом их удаляет.


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


Название: Re: Очистка буферов QTcpSocket
Отправлено: Bepec от Сентябрь 05, 2017, 19:57
Дык флушьте и читайте. Сделав readAll flush вы гарантируете что у вас обрезков нет. Но, соответственно, вам нужно флагами или как контролировать самому отправку.

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

PS флуш очищает буфер, заканчивая пересылку данных, которые ВЫ оправили.


Название: Re: Очистка буферов QTcpSocket
Отправлено: sergek от Сентябрь 05, 2017, 20:23
Дык флушьте и читайте.
Насчет readAll - все правильно. А flush делать нельзя - этот мусор попрет в устройства, и что в ответ получим - неизвестно.


Название: Re: Очистка буферов QTcpSocket
Отправлено: Bepec от Сентябрь 05, 2017, 20:25
Там не мусор.. В буфере отправки лежат пакеты, которые ещё не отправлены в сеть. То, что вы туда write, но ещё не успело отправиться.
И flush вы их принудительно отсылаете.
Т.е. если бы вы просто чистили буфер отправки, то отправилось бы полпакета, а вторую половину вы бы затёрли :D и у вас чур чыгыдык наступил бы в канале :D Ну или команды потерялись