首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

,关于WinINet Http通信

2012-01-22 
求助,关于WinINet Http通信我正在用WinINethttp与一个Http服务器通信,在网络条件比较好时没有任何问题,服

求助,关于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比较方便的自定义超时,不过异步方式比较复杂。
如果用同步方式,可以用个单独的线程定时,时间到了,反序关闭所有句柄...

热点排行