为啥调用带有 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 函数仍然等待?的主要内容,如果未能解决你的问题,请参考以下文章
为啥带有'exists'的sql运行速度比使用MySQL的'in'慢
为啥编译器标志“-mcpu=cortex-m3”与 stm32f10x 出错?