【问题标题】:Why does WinHttpQueryDataAvailable say 0 bytes are available?为什么 WinHttpQueryDataAvailable 说 0 个字节可用?
【发布时间】:2011-11-21 16:19:09
【问题描述】:

同步操作。 GetLastError = 0,WinHttpQueryDataAvailable 本身返回 TRUE(即 OK)但要读取的字节数 = 0

知道这意味着什么吗?它通常工作正常(从相机读取 JPEG 流),但偶尔会卡在这里(提示代码重新连接)。

根据 MSDN,WinHttpQueryDataAvailable 不应该返回:“如果会话是同步的,则请求会等待直到数据可用。”

代码摘录在这里:

g_HSession = WinHttpOpen( L"Jet", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0 );

ResultsOk = WinHttpSendRequest( 
    hRequest,
    WINHTTP_NO_ADDITIONAL_HEADERS,
    0, WINHTTP_NO_REQUEST_DATA, 0, 
    0, 0);

// End the request.
if (ResultsOk)
{
    ResultsOk = WinHttpReceiveResponse( hRequest, NULL );

    DWORD BytesToRead = 0;

    if (WinHttpQueryDataAvailable( hRequest, &BytesToRead ))
    {
        if (BytesToRead) // THIS IS SOMETIMES 0 - seems wrong to me
        {
            if (WinHttpReadData( hRequest, pReadPos, min(BytesToRead, (unsigned)SizeRemaining), &NumRead ))
            {
                ...etc!

【问题讨论】:

  • 这可能适用,见备注,第三段。 link

标签: c windows winapi http


【解决方案1】:

已经成功接收到底层 HTTP 响应,但是它是空的(即零长度响应)或所有数据已被读取并关闭。 WinHttpQueryDataAvailable 通过返回 TRUE 来表示这一点,仍然显示可用数据计数为零。

想一想:

HTTP/1.0 200 OK
Content-Length: 0

【讨论】:

  • 对此值的适当响应是什么?还在调用 WinHttpReadData 吗?或者是其他东西。这有点奇怪,因为我期待连续的 JPEG 流
  • 使用Wireshark验证http消息中是否真的有实体主体;我从来没有让 WinHttp 无法将身体交给我(令人毛骨悚然)。
  • 只需在同一个连接上打开另一个请求。连续的 JPEG 流听起来像是来自 IP 摄像头的源源不断的流,但现在的摄像头经常出现故障,因此,如果由于某种原因摄像头让您大吃一惊,您可以打开一个新请求并尝试恢复传输。还要确保使用网络嗅探器来检查实际流量(如上所述)。
  • 嗯,很高兴知道您认为它令人毛骨悚然。我担心我应该以不同的方式处理它!当它发生时(静止),我关闭连接并重试。不幸的是,新连接往往会立即执行相同的操作(至少在几个周期内)。
  • 市面上有 1000 多种型号的 IP 摄像机,可提供 JPEG 和/或 M-JPEG。数百人在 HTTP 合规性方面存在荒谬的问题。
【解决方案2】:

我假设您的 BytesToRead 变量应该是无符号的?

您可以尝试重组代码,使其看起来更像this page 上“示例”标题下的示例。

this solution 有帮助吗?

与问题无关,但如果您使用的是 Visual Studio,则可以进入项目设置(例如项目属性 > 项目默认值 > 字符集),然后您不必将 L 放在字符串之前在g_HSession = WinHttpOpen( L"Jet"...做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-26
    • 2011-08-17
    • 2017-01-03
    • 2021-01-08
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 2021-03-05
    相关资源
    最近更新 更多