为什么WinHttpQueryDataAvailable说0字节可用?

时间:2011-11-21 16:19:09

标签: c windows winapi http

同步操作。 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!

2 个答案:

答案 0 :(得分:3)

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

想一想:

HTTP/1.0 200 OK
Content-Length: 0

答案 1 :(得分:1)

我假设你的BytesToRead变量是无符号长的,因为它应该是?

您可以尝试重新构建代码,使其更像this page上“示例”标题下的示例。

this solution有帮助吗?

无关紧要,但如果您使用的是Visual Studio,则可以进入项目设置(类似Project Properties> Project Defaults> Character Set),然后您不必将L放在字符串之前和你在g_HSession = WinHttpOpen( L"Jet"...中一样。