【问题标题】: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(),但该函数仍会阻塞等待数据。这是为什么呢?

【问题讨论】:

    标签: winapi wininet


    【解决方案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 的意思是不等待所有请求的数据缓冲区被填满。但是,它仍会等待 一些 数据到达。如果没有数据到达,它会阻塞。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-09
        • 2021-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 2018-08-03
        相关资源
        最近更新 更多