同步操作。 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!
答案 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"...
中一样。