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