C 为什么WinHttpQueryDataAvailable说0字节可用?
同步操作C 为什么WinHttpQueryDataAvailable说0字节可用?,c,windows,winapi,http,C,Windows,Winapi,Http,同步操作GetLastError=0,WinHttpQueryDataAvailable本身返回TRUE(即OK),但要读取的字节数=0 你知道这是什么意思吗?它通常工作正常(从相机读取JPEG流),但偶尔会卡在这里(这会提示代码重新连接) 根据MSDN的说法,WinHttpQueryDataAvailable不应该返回:“如果会话是同步的,请求将等待数据变为可用。” 代码摘录如下: g_HSession = WinHttpOpen( L"Jet", WINHTTP_ACCESS_TYPE_DE
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!
我假设您的
BytesToRead
变量是一个无符号长变量,它应该是什么
您可以尝试重新构造代码,使其看起来更像上“Examples”标题下的示例
有帮助吗
与问题无关,但如果您使用的是Visual Studio,则可以进入项目设置(类似于项目属性>项目默认值>字符集),然后不必像在
g_HSession=WinHttpOpen(L“Jet”)中那样将L放在字符串之前…
已成功接收基础HTTP响应,但该响应为空(即零长度响应)或所有数据均已读取并关闭。WinHttpQueryDataAvailable
通过返回TRUE
表示此情况,仍然显示零可用数据计数
想想:
HTTP/1.0 200 OK
Content-Length: 0
这可能适用,请参见备注,第三段。对该值的适当响应是什么?仍然调用WinHttpReadData?或其他东西。这有点奇怪,因为我期望连续的JPEGsUse Wireshark流来验证http消息中是否确实存在实体体;我从来没有让WinHttp无法向我提供实体体(令人毛骨悚然)。只需在同一连接上打开另一个请求。连续的JPEG流听起来像是来自IP摄像头的无穷无尽的流,但如今摄像头经常有很多问题。因此,如果出于某种原因摄像头让您如此惊讶,您可以打开一个新请求并尝试恢复传输。同时,请确保使用网络嗅探器检查实际的流量c(如上所述)。很好,你知道这很可怕。我担心我应该以不同的方式处理它!当它发生时,我关闭连接并重试。不幸的是,新连接往往会立即(至少在几个周期内)做同样的事情.目前有1000多种型号的IP摄像头,可提供JPEG和/或M-JPEG格式。数百种都存在与HTTP兼容的荒谬问题。