Поведение QTcpSocket :: waitForBytesWritten? - PullRequest
10 голосов
/ 11 января 2011

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

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

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

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

1 Ответ

7 голосов
/ 11 января 2011

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

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

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

...