J'ai du code qui exécute des requêtes HTTP en utilisant les API WinInet de manière asynchrone. En général, mon code fonctionne, mais je suis confus au sujet de la «bonne» façon de faire les choses. Dans la documentation InternetReadFile(), il déclare:Manière correcte d'utiliser InternetReadFile() de manière asynchrone
Pour que toutes les données sont extraites, une application doit continuer à appeler la fonction InternetReadFile jusqu'à ce que la fonction retourne TRUE et le paramètre lpdwNumberOfBytesRead est égal à zéro.
mais en mode asynchrone, il peut (ou non) return false, et une erreur de ERROR_IO_PENDING
, indiquant qu'il fera le travail de manière asynchrone, et appeler mon rappel lorsque vous avez terminé. Si je lis littéralement la documentation, il semble que les appels asynchrones pourraient également faire une lecture partielle du tampon demandé, et exiger que l'appelant continue d'appeler InternetReadFile jusqu'à ce qu'une lecture de 0 octet soit rencontrée.
Une implémentation typique utilisant InternetReadFile()
serait synchroniquement ressembler à quelque chose comme ceci:
while(InternetReadFile(Request, Buffer, BufferSize, &BytesRead) && BytesRead != 0)
{
// do something with Buffer
}
mais avec la possibilité que tout un appel à InternetReadFile()
pourrait signaler qu'il va faire le travail de manière asynchrone (et peut-être lire une partie, mais pas tout de votre demande), il devient beaucoup plus compliqué. Si je passe à MSDN sample code pour des conseils, l'implémentation est simple, appelant simplement InternetReadFile()
une fois, et attend un seul retour ayant lu la totalité du tampon demandé soit instantanément soit asynchrone. Est-ce la façon correcte d'utiliser cette fonction, ou MSDN Sample Code ignore-t-il la possibilité que InternetReadFile()
lira seulement une partie de la mémoire tampon demandée?