SendRequest 有时候会出现超时现象怎么解决?

Stay_Deep 2014-08-25 02:01:56
  httpSession.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT,5000);
httpSession.SetOption(INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT,5000);
httpSession.SetOption(INTERNET_OPTION_SEND_TIMEOUT,5000);

BOOL bSendRequest=httpFile->SendRequest(NULL,0,(LPVOID)(LPCTSTR)strFormData,0);

上面设置了超时倒是有时候程序还是会出现严重BUG,线程还没有结束,就爆出超时BUG, 请问这个问题怎么解决?
...全文
965 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
不败的拿破仑 2014-08-26
  • 打赏
  • 举报
回复
而且SendRequest的超时时间是不准确的,微软的建议做法是,在多线程中,通过自己设定时器来判断时间是否超时。
不败的拿破仑 2014-08-26
  • 打赏
  • 举报
回复
引用 11 楼 Stay_Deep 的回复:
你的意思是说 catch(CInternetException *px) { DWORD error; error=px->m_dwError; } 这样看下error 错误值?
是的,这个通信超时,都是抛出internet的异常的,可以看MSDN 有说 http://msdn.microsoft.com/en-us/library/2xfbsd16(VS.80).aspx
Stay_Deep 2014-08-26
  • 打赏
  • 举报
回复
你的意思是说 catch(CInternetException *px) { DWORD error; error=px->m_dwError; } 这样看下error 错误值?
Stay_Deep 2014-08-26
  • 打赏
  • 举报
回复
errore: if(httpFile!=NULL) { // BOOL bSendRequest; try { bSendRequest=httpFile->SendRequest(NULL,0,(LPVOID)(LPCTSTR)strFormData,0); } catch(...) { Gnumber++; if(Gnumber<=3) { goto errore; } } 我直接就这样写了 ,
oyljerry 2014-08-26
  • 打赏
  • 举报
回复
引用 8 楼 Stay_Deep 的回复:
看错了, catch(...) 没报错, 就是不知道能不能用
catch后查看一下错误信息
Stay_Deep 2014-08-26
  • 打赏
  • 举报
回复
看错了, catch(...) 没报错, 就是不知道能不能用
Stay_Deep 2014-08-26
  • 打赏
  • 举报
回复
代码提示是错误的。
Stay_Deep 2014-08-26
  • 打赏
  • 举报
回复
try { BOOL bSendRequest=httpFile->SendRequest(NULL,0,(LPVOID)(LPCTSTR)strFormData,0); } catch(...) { goto error; } 不能这样捕获所有异常吗?
encoderlee 2014-08-25
  • 打赏
  • 举报
回复
你并没有捕获和处理异常,所以弹出了错误窗口,CHttpConnection、CInternetConnection这些类是通过抛出CInternetException异常来处理错误的。 C++异常处理try-catch
Stay_Deep 2014-08-25
  • 打赏
  • 举报
回复
注册响应函数, 能具体说下嘛? 我不了解那个。
Stay_Deep 2014-08-25
  • 打赏
  • 举报
回复


CMySynDlg *pDialog=(CMySynDlg *)pParam; //获得主窗口指针

HWND hWnd;

hWnd=AfxGetApp()->GetMainWnd()->GetSafeHwnd(); //获得主窗口句柄



//---------------------------------设置超时

CInternetSession httpSession; //创建一个会话链接


httpSession.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT,5000);
httpSession.SetOption(INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT,5000);
httpSession.SetOption(INTERNET_OPTION_SEND_TIMEOUT,5000);



//----------------------------------end


CHttpFile *httpFile=NULL; //用于文件和返回操作
INTERNET_PORT httpPort=pDialog->Ports;
CHttpConnection *pHttpConnection=httpSession.GetHttpConnection(pDialog->wangzhi,httpPort,NULL,NULL,NULL); //获得一个指向httpconnection的指针

if(pHttpConnection!=NULL)
{

CString RequestWay("HTTP_VERB_HEAD");
CString dxs("");
CString sxs("HTTP/1.1");
Couts one;
char outs[4];
outs[3]='\0';

if(filex!=FALSE) //判断新打开的字典是否为空
{

CString strHeads=_T("Content-Type: application/x-www-form-urlencoded");//http协议
CString circle("");
CString strFormData;
CString Views("");
strFormData.Format( _T("UserName= %s"),circle);


EnterCriticalSection(&Wayone_cx); //进入临界区对象。

while(filex.ReadString(dxs)) //读文件字典
{

httpFile=pHttpConnection->OpenRequest(2,dxs,NULL,1,NULL,HTTP_VERSION,INTERNET_FLAG_DONT_CACHE);

LeaveCriticalSection(&Wayone_cx); //释放临界区对象。

CurrentFileNumber++; //当前读取字典的位置


if(httpFile!=NULL)
{
//
BOOL bSendRequest=httpFile->SendRequest(NULL,0,(LPVOID)(LPCTSTR)strFormData,0);


偶尔执行到这个SendRequest 就会出现上面那幅图片的样子
encoderlee 2014-08-25
  • 打赏
  • 举报
回复
超时BUG是什么? 另外你设置只是数据接收和数据发送的超时值,并没有设置连接时的超时值(INTERNET_OPTION_CONNECT_TIMEOUT),连接超时还是默认的30秒。 和超时有关的标识有: INTERNET_OPTION_CONNECT_TIMEOUT INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT INTERNET_OPTION_CONTROL_SEND_TIMEOUT INTERNET_OPTION_DATA_RECEIVE_TIMEOUT INTERNET_OPTION_DATA_SEND_TIMEOUT INTERNET_OPTION_DISCONNECTED_TIMEOUT INTERNET_OPTION_FROM_CACHE_TIMEOUT INTERNET_OPTION_LISTEN_TIMEOUT INTERNET_OPTION_RECEIVE_TIMEOUT INTERNET_OPTION_SEND_TIMEOUT 具体见MSDN:http://msdn.microsoft.com/en-us/library/windows/desktop/aa385328(v=vs.85).aspx
oyljerry 2014-08-25
  • 打赏
  • 举报
回复
注册响应函数,超时的时候会调用你的响应函数,然后进行处理

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧