读书人

关于WinINet Http通信

发布时间: 2012-01-22 22:38:43 作者: rapoo

求助,关于WinINet Http通信
我正在用WinINet http与一个Http服务器通信,在网络条件比较好时没有任何问题,服务器会很快响应,但小猫拨号上网时情况就不一样了,如果我不设置网络超时(InternetSetOption)则可能会等待服务器响应长达半小时之久,后来我设置了网络超时,这下可好了,HttpSendRequest会很快返回,但得到的结果总是“操作超时”

以下是文件下载部分代码,

//下载文件szFileURL从nStart开始nLen字节,下载内容用ppIResult带回
ENetRequestResult CFileTransfer::DownloadFile(const char* szFileURL, unsigned int nStart, unsigned int nLen, IMemBlock** ppIResult)
{
//参数查错
if( (!szFileURL) || (!nLen) || (!ppIResult) )
{
return ENRR_InvalidParam;
}

try
{
//初始化当前线程COM
CAutoInitCOM _COMAutoIniter;

//申请内存块对象
std::auto_ptr <CMemBlock> pMemBlock(new CMemBlock);
if( !pMemBlock.get() ) return ENRR_AllocMem;
if( !pMemBlock-> Resize(nLen) ) return ENRR_AllocMem;

//解析URL
const CSampleURL url(szFileURL);

//创建“连接”对象
std::auto_ptr <CHttpConnection> pConnection( m_pSession-> GetHttpConnection(url.GetHostAddr(), url.GetPort()) );
if( !pConnection.get() ) return ENRR_NetErr;

//创建“file”对象
std::auto_ptr <CHttpFile> pFile;
{
static const char* ppAccept[] = { "*/* ", NULL};
pFile = std::auto_ptr <CHttpFile> (
pConnection-> OpenRequest(
CHttpConnection::HTTP_VERB_GET,
url.GetObject(),
NULL,
1,
ppAccept,
NULL,
INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE
)
);
}
if( !pFile.get() ) return ENRR_NetErr;

//添加http请求头,指示下载的部分
{
CString strHeader;
strHeader.Format( "Range:bytes=%u-\r\n ", nStart);
VERIFY( pFile-> AddRequestHeaders(strHeader, HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDREQ_FLAG_ADD) );
}

//发送请求
if( !pFile-> SendRequest() ) //!在小猫拨号上网的条件下,这里会等待很长时间,我进去跟踪了一下实际是(::HttpSendRequest)等了很长时间
{
return ENRR_NetErr;
}

//判断服务器回应码
if( !IsHttpServerResponseSucceed(*pFile) )
{
return ENRR_NetErr;
}

//下载数据
UINT nDownloaded = 0; //已下载
for(;;)
{
const UINT nReadLen = pFile-> Read(((BYTE*)pMemBlock-> GetAddr()) + nDownloaded, pMemBlock-> GetSize() - nDownloaded);
if( !nReadLen ) break; //读完了
nDownloaded += nReadLen;
}
assert( nDownloaded <= pMemBlock-> GetSize() );
if( nDownloaded < pMemBlock-> GetSize() )
{
pMemBlock-> Resize( nDownloaded );
}

//别忘了对象是要交给Caller去管理的
*ppIResult = pMemBlock.release();
}
catch(CInternetException* e)
{
char buf[1024];
e-> GetErrorMessage(buf, sizeof(buf)); //!在小猫拨号上网的条件下,这在里总会是”操作超时”
TRACE( "%s\n ", buf);
e-> Delete();
return ENRR_NetErr; //WinInet异常
}
catch(...)
{
assert( ! "未知异常! " );
return ENRR_NetErr;
}

return ENRR_Ok;
}


哪位大侠遇到过这种问题,请给指点指点,


不胜感激!!!


[解决办法]
没有碰到过,改长超时时间试试
[解决办法]
我也遇到过同样的问题,据说MS有bug,我的建议是,不要用InternetSetOption设置超时,就用默认的(要半小时,太夸张了吧?)
要设超时,可以用异步方式,可以利用WaitFor...Object比较方便的自定义超时,不过异步方式比较复杂。
如果用同步方式,可以用个单独的线程定时,时间到了,反序关闭所有句柄...

读书人网 >VC/MFC

热点推荐