Поведение QTcpSocket:: waitForBytesWritten?
Я немного смущен поведением QTcpSocket::waitForBytesWritten()
...
до каких пор эта функция блокируется?
- пока данные не будут записаны во внутренний буфер ОС для передачи по TCP?
- пока данные не будут физически преобразованы в пакеты TCP и отправлены?
- пока все данные не будут переданы и удаленный клиент не подтвердит, что все пакеты были получены?
Я посмотрел на документы, но, похоже, не очень ясные.
1 ответов
вообще говоря, ОС предоставляют только простые API для первого вопроса - поскольку Qt является портативным API, лучше всего полагаться только на него, ссылаясь на передачу в буфер ОС. Если вам нужно фактическое подтверждение получения, лучше всего отправить его удаленным приложением - в конце концов, данные могут быть ack'D удаленным, но никогда не считываются с буфера чтения ОС удаленного.
Если вам нужно избежать иметь удаленный бортовой блок вы навсегда, то вы должны вместо ждать QIODevice::bytesWritten
сигнал и возврат к циклу событий для выполнения другой работы или просто установите соответствующий тайм-аут. В общем, удаленная сторона всегда может заблокировать вас на каком - то уровне-т. е. она может отказаться от ack, заполнив ваш локальный буфер ОС, в этот момент записи не сделают это из Qt в ОС; независимо от того, какой уровень waitForBytesWritten()
в, он всегда может быть заблокирована.
в таком виде bytesWritten
и waitForBytesWritten()
следует использовать только для дросселирования источника данных-т. е., если вы должны были войти в плотный цикл, передающий 1G данных в сокет сразу, вы можете в конечном итоге буферизировать его в процессе и исчерпать память. Вызывая дополнительные чтения / записи с помощью bytesWritten
сигнал, вы можете избежать этой проблемы.