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

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

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

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

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

Ответ 1

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

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

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