Winapi 为什么使用IRF_NO_WAIT标志调用InternetReadFileEx函数仍在等待?

Winapi 为什么使用IRF_NO_WAIT标志调用InternetReadFileEx函数仍在等待?,winapi,wininet,Winapi,Wininet,我正在使用同步wininet请求并使用IRF\u NO\u WAIT标志进行调用,但该函数仍然阻止等待数据。这是为什么?IRF\u NO\u WAIT的意思是不等待所有请求的数据缓冲区都被填满。然而,它仍将等待一些数据到达。如果没有数据到达,它将阻塞。在中,IRF\u no\u WAIT的含义描述为: 不要等待数据。如果有可用数据,函数将返回请求的数据量或可用数据量(以较小者为准) 奇怪的是,它使得没有可用数据的情况没有定义。显然,如果没有数据,它会阻塞直到有数据为止。一种可能的解决方法是使用I

我正在使用同步wininet请求并使用
IRF\u NO\u WAIT
标志进行调用,但该函数仍然阻止等待数据。这是为什么?

IRF\u NO\u WAIT的意思是不等待所有请求的数据缓冲区都被填满。然而,它仍将等待一些数据到达。如果没有数据到达,它将阻塞。

在中,
IRF\u no\u WAIT
的含义描述为:

不要等待数据。如果有可用数据,函数将返回请求的数据量或可用数据量(以较小者为准)


奇怪的是,它使得没有可用数据的情况没有定义。显然,如果没有数据,它会阻塞直到有数据为止。

一种可能的解决方法是使用InternetQueryOption()获取INTERNET诊断套接字信息结构,然后将套接字句柄传递给::select(),超时时间为{0,0},以确定数据是否可用而不阻塞。

奇怪的是,如果查看wininet.h,IRF_NO_WAIT和IRF_USE_CONTEXT具有相同的值。它们都定义为0x00000008。IRF_ASYNC为0x00000001,IRF_SYNC为0x00000004。如果此标志用作位掩码,则IRF_NO_WAIT既不指定IRF_ASYNC也不指定IRF_SYNC。我猜这意味着它不强制执行同步操作,也不强制执行异步操作,但它可以使用其中任何一种?事实上,文档只是让我们对它的实际工作方式一无所知。