Как правильно определить, что был достигнут конец ввода в QTCPSocket? - PullRequest
3 голосов
/ 27 октября 2010

У меня есть следующий код, который читает из QTCPSocket:

QString request;

while(pSocket->waitForReadyRead())
{
    request.append(pSocket->readAll());
}

Проблема с этим кодом состоит в том, что он читает все входные данные и затем останавливается в конце на 30 секунд.(Какой тайм-аут по умолчанию.)

Как правильно избежать длительного тайм-аута и обнаружить, что конец ввода был достигнут?(Ответ, который избегает сигналов, является предпочтительным, поскольку предполагается, что это происходит синхронно в потоке.)

Ответы [ 2 ]

2 голосов
/ 27 октября 2010

Единственный способ убедиться в том, что вы получили точное количество ожидаемых байтов.Обычно это делается путем отправки размера данных в начале пакета данных.Сначала прочтите это, а затем продолжайте цикл, пока не получите все это.Альтернативой является использование сторожа, определенной серии байтов, которые отмечают конец данных, но это обычно становится грязным.

0 голосов
/ 22 сентября 2011

Если вы имеете дело с ситуацией, подобной ответу HTTP, который не содержит Content-Length, и вы знаете, что другой конец закроет соединение после отправки данных, есть альтернативное решение.

  1. Используйте socket.setReadBufferSize, чтобы убедиться, что имеется достаточно буфера чтения для всех данных, которые могут быть отправлены.
  2. Вызовите socket.waitForDisconnected, чтобы дождаться, пока удаленный конец закроет соединение
  3. Используйте socket.bytesAvailable в качестве длины содержимого

Это работает, потому что закрытие соединения не отбрасывает буферизованные данные в QTcpSocket.

...