2009-06-20 9 views

Répondre

1

Dans le MSDN docs, le sens de IRF_NO_WAIT est décrite comme suit

Ne pas attendre pour les données. Si des données sont disponibles, la fonction renvoie la quantité de données demandée ou la quantité de données disponibles (la plus petite des deux).

Mystérieusement, il laisse le cas où il n'y a pas données non défini. Apparemment, s'il y a aucune donnée, il bloque jusqu'à ce qu'il y en ait.

+0

Bizarrement, IRF_NO_WAIT et IRF_USE_CONTEXT ont la même valeur si vous regardez wininet.h. Ils sont tous deux définis sur 0x00000008. IRF_ASYNC est 0x00000001 et IRF_SYNC est 0x00000004. Si cet indicateur est utilisé comme masque de bits, alors IRF_NO_WAIT ne spécifie ni IRF_ASYNC ni IRF_SYNC. Je suppose que cela signifie qu'il ne force pas les opérations de synchronisation et qu'il ne force pas les opérations asynchrones, mais il pourrait utiliser non plus? Vraiment, la documentation ne nous laisse aucune idée sur la façon dont cela fonctionne réellement. – Derek

0

Ce qui signifie IRF_NO_WAIT est de ne pas attendre tous de la mémoire tampon de données demandées à remplir. Cependant, il attend encore des données pour arriver. Si aucune donnée n'arrive, elle bloque.

1

Une solution de contournement possible est d'utiliser InternetQueryOption() pour obtenir une structure INTERNET_DIAGNOSTIC_SOCKET_INFO, puis passez le handle SOCKET à :: select() avec un délai de {0, 0} pour déterminer si les données sont disponibles sans blocage.