为啥调用带有 IRF_NO_WAIT 标志的 InternetReadFileEx 函数仍然等待?

Posted

技术标签:

【中文标题】为啥调用带有 IRF_NO_WAIT 标志的 InternetReadFileEx 函数仍然等待?【英文标题】:Why does calling the InternetReadFileEx function with IRF_NO_WAIT flag still wait?为什么调用带有 IRF_NO_WAIT 标志的 InternetReadFileEx 函数仍然等待? 【发布时间】:2009-06-20 21:34:08 【问题描述】:

我正在使用同步 wininet 请求并使用 IRF_NO_WAIT 标志调用 InternetReadFileEx(),但该函数仍会阻塞等待数据。这是为什么呢?

【问题讨论】:

【参考方案1】:

在MSDN docs中,IRF_NO_WAIT的含义描述为:

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

神秘的是,它没有定义 not 数据可用的情况。显然,如果有 no 数据,它会阻塞直到有一些。

【讨论】:

奇怪的是,如果您查看 wininet.h,IRF_NO_WAIT 和 IRF_USE_CONTEXT 具有相同的值。它们都定义为 0x00000008。 IRF_ASYNC 是 0x00000001,IRF_SYNC 是 0x00000004。如果此标志用作位掩码,则 IRF_NO_WAIT 既不指定 IRF_ASYNC 也不指定 IRF_SYNC。我想这意味着它不会强制同步操作,也不会强制异步操作​​,但它可以使用吗?真的,文档只是让我们对它的实际工作方式一无所知。【参考方案2】:

一种可能的解决方法是使用 InternetQueryOption() 获取 INTERNET_DIAGNOSTIC_SOCKET_INFO 结构,然后将 SOCKET 句柄传递给 ::select(),超时时间为 0, 0,以确定数据是否可用而不会阻塞。

【讨论】:

【参考方案3】:

IRF_NO_WAIT 的意思是不等待所有请求的数据缓冲区被填满。但是,它仍会等待 一些 数据到达。如果没有数据到达,它会阻塞。

【讨论】:

以上是关于为啥调用带有 IRF_NO_WAIT 标志的 InternetReadFileEx 函数仍然等待?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 EditText 验证时会出现两个错误标志?

为啥带有'exists'的sql运行速度比使用MySQL的'in'慢

为啥编译器标志“-mcpu=cortex-m3”与 stm32f10x 出错?

为啥 Java System.in.read() 可以调用不是静态方法

为啥我不能有两个带有 ArrayList 参数的方法?

为啥 aspnet_compiler 以可更新标志成功,但否则失败?