Вопрос толкования документации IOCP - неоднозначность владения буфером
Поскольку я не являюсь носителем английского языка, я мог бы что-то упустить, так что, возможно, кто-то здесь знает лучше меня.
Взято изWSASendОбсуждение в MSDN:
lpBuffers [in]
Указатель на массив структур WSABUF. Каждая структура WSABUF содержит указатель на буфер и длину буфера в байтах. Для приложения Winsock после вызова функции WSASendсистема владеет этими буферами, и приложение может не получить к ним доступ, Этот массив должен оставаться действительным в течение всей операции отправки.
Хорошо, вы видите жирный текст? Это неясное место!
Я могу подумать о двух переводах для этой строки (может быть что-то еще, вы называете это):
Перевод 1 -«буферы» относятся к структуре OVERLAPPED что я передаю эту функцию при вызове. Я могу снова использовать объект только при получении уведомления о его завершении.
Перевод 2 -«буферы» относятся к фактическим буферамте, с данными, которые я отправляю. Если объект WSABUF указывает на один буфер, то я не могу коснуться этого буфера, пока операция не будет завершена.
Кто-нибудь может сказать, как правильно интерпретировать эту строку?
И ..... Если ответ второй - как бы вы решили?
Потому что для меня это означает, что для каждого отправляемого мною данных / буфера я должен сохранить его копию на стороне отправителя - таким образом, имея МНОГИЕ «ожидающие» буферы (разных размеров) в приложении с высоким трафиком, которое действительно происходит повредить "масштабируемость".
Заявление 1:
В дополнение к вышеприведенному абзацу («И ....») я подумал, что IOCP копирует данные для отправки в свой собственный буфер и отправляет оттуда, если вы не установитеSO_SNDBUF в ноль.
Заявление 2:
Я использую стековые буферы (вы знаете, что-то вродеchar cBuff[1024];
в теле функции - если перевод на основной вопрос является вторым вариантом (то есть буферы должны оставаться такими, какими они являются до завершения отправки), тогда ... это действительно приводит к серьезным ошибкам! Можете ли вы придумать способ решить эту проблему? (Я знаю, я спросил это другими словами выше).