У меня есть код, который выполняет HTTP-запросы с использованием API WinInet асинхронно. В общем, мой код работает, но я смущен о «правильном» способе делать что-то. В документации к InternetReadFile(), говорится:Правильный способ использования InternetReadFile() асинхронно
Чтобы убедиться, что все данные извлекаются, приложение должно продолжать называть функция InternetReadFile пока функция возвращает TRUE, а параметр lpdwNumberOfBytesRead равен нулю.
но в асинхронном режиме, он может (или не может) возвращать ложь, и ошибка ERROR_IO_PENDING
, указав, что он будет делать работу асинхронно, и вызвать мою функцию обратного вызова после завершения. Если я прочитал документацию буквально, кажется, что асинхронные вызовы также могут просто выполнить частичное чтение запрашиваемого буфера и потребовать от вызывающего абонента продолжать вызов InternetReadFile до тех пор, пока не будет обнаружено чтение из 0 байтов.
Типичная реализация с использованием InternetReadFile()
синхронно будет выглядеть примерно так:
while(InternetReadFile(Request, Buffer, BufferSize, &BytesRead) && BytesRead != 0)
{
// do something with Buffer
}
, но с возможностью того, что какой-либо один вызов InternetReadFile()
может сигнализировать, что он собирается сделать работу асинхронно (и, возможно, прочитать часть, но не весь ваш запрос), это становится намного сложнее. Если я перейду к руководству MSDN sample code, реализация проста, просто позвонив InternetReadFile()
один раз и ожидая, что один возврат будет прочитан весь запрошенный буфер либо мгновенно, либо асинхронно. Является ли это правильным способом использования этой функции или является примером кода MSDN, игнорируя возможность того, что InternetReadFile()
будет читать только часть запрошенного буфера?