Поведение QTCPSocket :: Waitforbytes #
-
09-10-2019 - |
Вопрос
Я немного запутался по поведению QTcpSocket::waitForBytesWritten()
...
До тех пор, когда этот функциональный блок?
- Пока данные не будут записаны на внутренний буфер ОС для передачи по TCP?
- Пока данные не будут физически преобразованы в пакеты TCP и отправлены?
- Пока все данные не будут переданы, и удаленный клиент подтверждает, что все пакеты были получены?
Я посмотрел на документацию, но, похоже, это не было очень ясно.
Решение
Вообще говорящие OSES предоставляют только легкие API для первого вопроса - поскольку Qt является портативным API, лучше всего лишь полагаться на него ссылку на передачу в буфер ОС. Если вам нужно фактическое подтверждение квитанции, лучше всего отправлять на удаленное приложение - в конце концов, данные могут быть ACK'D на удаленном, но никогда не читайте с помощью буфера чтения ОС RUB.
Если вам нужно избегать удаленного бокового блокировки навсегда, вы должны дождаться QIODevice::bytesWritten
Сигнал и вернитесь к цикле событий, чтобы выполнить другую работу или просто установить подходящий тайм-аут. В общем, удаленная сторона всегда может блокировать вас на некотором уровне - т. Е. Это может отказаться от ACK, заполняя ваш локальный буфер ОС, в какой точку пишет, не сделает его из QT в ОС; Неважно, какой уровень waitForBytesWritten()
в том, что он всегда может быть заблокирован.
Как таковой, bytesWritten
и waitForBytesWritten()
Следует использоваться только для дросселя источника данных - то есть, если вы должны были попасть в тесную петлю, прошедший 1G данных в сокет, все сразу, вы можете в конечном итоге буферизировать его в процессе и заканчивая памятью. Запустив дополнительные чтения / пишеты с bytesWritten
Сигнал, вы можете избежать этой проблемы.