Вопрос

Я немного запутался по поведению QTcpSocket::waitForBytesWritten()...

До тех пор, когда этот функциональный блок?

  • Пока данные не будут записаны на внутренний буфер ОС для передачи по TCP?
  • Пока данные не будут физически преобразованы в пакеты TCP и отправлены?
  • Пока все данные не будут переданы, и удаленный клиент подтверждает, что все пакеты были получены?

Я посмотрел на документацию, но, похоже, это не было очень ясно.

Это было полезно?

Решение

Вообще говорящие OSES предоставляют только легкие API для первого вопроса - поскольку Qt является портативным API, лучше всего лишь полагаться на него ссылку на передачу в буфер ОС. Если вам нужно фактическое подтверждение квитанции, лучше всего отправлять на удаленное приложение - в конце концов, данные могут быть ACK'D на удаленном, но никогда не читайте с помощью буфера чтения ОС RUB.

Если вам нужно избегать удаленного бокового блокировки навсегда, вы должны дождаться QIODevice::bytesWritten Сигнал и вернитесь к цикле событий, чтобы выполнить другую работу или просто установить подходящий тайм-аут. В общем, удаленная сторона всегда может блокировать вас на некотором уровне - т. Е. Это может отказаться от ACK, заполняя ваш локальный буфер ОС, в какой точку пишет, не сделает его из QT в ОС; Неважно, какой уровень waitForBytesWritten() в том, что он всегда может быть заблокирован.

Как таковой, bytesWritten и waitForBytesWritten() Следует использоваться только для дросселя источника данных - то есть, если вы должны были попасть в тесную петлю, прошедший 1G данных в сокет, все сразу, вы можете в конечном итоге буферизировать его в процессе и заканчивая памятью. Запустив дополнительные чтения / пишеты с bytesWritten Сигнал, вы можете избежать этой проблемы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top