有谁了解异步读取InternetReadFileEx()?
我使用异步方式InternetReadFileEx()读取,代码如下:
INTERNET_BUFFERS ib;
memset(&ib, 0, sizeof(INTERNET_BUFFERS));
ib.dwStructSize = sizeof(INTERNET_BUFFERS);
ib.lpvBuffer = (void *)pRecvBuffer;
ib.dwBufferLength = BUFFER_SIZE; // BUFFER_SIZE=1024
ib.dwBufferTotal = dwBufferTotal;
//******* 我临时加的 *******
ib.dwOffsetLow = 0;
ib.dwOffsetHigh = (dwBufferTotal==0) ? 0 : (dwBufferTotal-1);
//******* 我临时加的 *******
bOk = TRUE;
//while( bOk && ib.dwBufferLength!=0 )
//文件大于>4096左右的时候没必要循环的,
//正常的话应该等待回调收到下一次的INTERNET_STATUS_REQUEST_COMPLETE消息
//这里加循环适用于在文件较小的时候,可是我该怎么判断,什么时候要在这while循环?
//这就是我纳闷的地方
{
//Start the pump
TRACE("\n>>>>> Start the pump()...\n");
bOk = ::InternetReadFileEx( m_hHttpFile, &ib, IRF_ASYNC, dwContext );
if(!bOk && GetLastError()==ERROR_IO_PENDING)
{
// wait for next complete
(*pRequestCompleteID)++;
TRACE1(">>>>> Set nRequestCompleteID=%d.\n", *pRequestCompleteID);
}
else
{
if(bOk)
{
TRACE(">>>>> Start Pump() intermit!!\n");
TRACE1(">>>>> InternetReadFileEx() : ==> %d.\n", bOk);
TRACE1(">>>>> GetLastError()==ERROR_IO_PENDING ? : ==> %d.\n",
(GetLastError()==ERROR_IO_PENDING));
TRACE1(">>>>> GetLastError() : ==> %d.\n", GetLastError());
TRACE1(">>>>> ib.dwBufferLength: %d\n", ib.dwBufferLength);
(*pRequestCompleteID)++;
TRACE1(">>>>> Set nRequestCompleteID=%d.\n", *pRequestCompleteID);
TRACE("\n");
}
else
{
TRACE(">>>>> Start Pump() error!!\n");
TRACE1(">>>>> InternetReadFileEx() : ==> %d.\n", bOk);
TRACE1(">>>>> GetLastError()==ERROR_IO_PENDING ? : ==> %d.\n",
(GetLastError()==ERROR_IO_PENDING));
TRACE1(">>>>> GetLastError() : ==> %d.\n", GetLastError());
*pRequestCompleteID = -1;
}
}
}
//正常的话应该只执行InternetReadFileEx()一次,返回值应该是False,
//GetLastError()应该等于ERROR_IO_PENDING。
//可是当URL文件为2890字节时,InternetReadFileEx()返回值为True, GetLastError()为0,但是偶尔有几次又不是:(
//怎么回事?我的读取缓冲区大小为1024。
谢谢。