Поведение QTcpSocket:: waitForBytesWritten?

Я немного смущен поведением QTcpSocket::waitForBytesWritten()...

до каких пор эта функция блокируется?

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

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

1 ответов


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

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

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