【发布时间】:2009-06-20 21:34:08
【问题描述】:
我正在使用同步 wininet 请求并使用 IRF_NO_WAIT 标志调用 InternetReadFileEx(),但该函数仍会阻塞等待数据。这是为什么呢?
【问题讨论】:
我正在使用同步 wininet 请求并使用 IRF_NO_WAIT 标志调用 InternetReadFileEx(),但该函数仍会阻塞等待数据。这是为什么呢?
【问题讨论】:
在MSDN docs中,IRF_NO_WAIT的含义描述为:
不要等待数据。如果有可用数据,该函数将返回请求的数据量或可用数据量(以较小者为准)。
神秘的是,它没有定义 not 数据可用的情况。显然,如果有 no 数据,它会阻塞直到有一些。
【讨论】:
一种可能的解决方法是使用 InternetQueryOption() 获取 INTERNET_DIAGNOSTIC_SOCKET_INFO 结构,然后将 SOCKET 句柄传递给 ::select(),超时时间为 {0, 0},以确定数据是否可用而不会阻塞。
【讨论】:
IRF_NO_WAIT 的意思是不等待所有请求的数据缓冲区被填满。但是,它仍会等待 一些 数据到达。如果没有数据到达,它会阻塞。
【讨论】: