5678|18

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

EVC4下 使用WININET的网络连接问题 [复制链接]

开启一个线程,使用WININET下载 上传数据:
部分代码如下:
int uParam = 5000;
int iTimeOut = 5000, iSendTimeOut = 1000, iRecvTimeOut = 7000,
iDataSendTO = 1000, iDataRecvTO = 7000, iRetry = 5;

inetSession.SetOption(INTERNET_OPTION_MAX_CONNS_PER_SERVER,
&uParam,sizeof(int));
inetSession.SetOption(INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER,
&uParam,sizeof(int));
inetSession.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,
&iTimeOut, sizeof(int));
inetSession.SetOption(INTERNET_OPTION_SEND_TIMEOUT,
&iSendTimeOut, sizeof(int));
inetSession.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT,
&iRecvTimeOut, sizeof(int));
inetSession.SetOption(INTERNET_OPTION_DATA_SEND_TIMEOUT,
&iDataSendTO, sizeof(int));
inetSession.SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT,
&iDataRecvTO, sizeof(int));
inetSession.SetOption(INTERNET_OPTION_CONNECT_RETRIES,
&iRetry, sizeof(int));

CString strWSData(_T(""));
CString strError(_T(""));

INTERNET_PORT port = nPort;

pHttpConn = inetSession.GetHttpConnection(strIP, port);
if (NULL == pHttpConn)
{
......
}

pHttpFile = pHttpConn->OpenRequest(CHttpConnection::HTTP_VERB_POST, (LPCTSTR)strURI);
if (NULL == pHttpFile)
{
if(pHttpConn)
{
pHttpConn->Close();
delete pHttpConn;
pHttpConn = NULL;
}

inetSession.Close();
}

pHttpFile->AddRequestHeaders(_T("Connection: Keep-Alive"));
pHttpFile->AddRequestHeaders(_T("Content-Type:text/xml;charset=gb2312"));
pHttpFile->AddRequestHeaders(_T("Accept-Language:zh-cn"));

if(!pHttpFile->SendRequest(NULL, 0, szSoap, strlen(szSoap)))
{
…………
}

…………
pHttpFile->QueryInfoStatusCode(dwCheck);

…………

在测试过程中,如果突然断网或者网络条件很差的情况下 函数在SendRequest处长时间不返回,并且整个程序会自动退出

求一解决方案;在网络条件不好或断开情况下,能够正常关闭该线程,但不会影响整个程序;或者能获取其返回者那更好。

在线等做过的或者 高手来。。

最新回复

那TerminateThread的第二个参数怎么获取 dwExitCode Specifies the exit code for the thread. Use the GetExitCodeThread function to retrieve a thread's exit value.   详情 回复 发表于 2008-6-27 10:32
点赞 关注

回复
举报

59

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
还是没有人来?
我网上看 说有种方法,
在网络通讯线程下,在开个线程,来监视,如果超时则关闭。
但是感觉这样也不能保证整个程序的安全?

想问下 如何在一个线程中再开个线程来空值这个线程?
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你的是什么代码,我怎么没看懂。

inetSession
pHttpConn
pHttpFile
都是什么类型。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
        CInternetSession inetSession(_T(""));       
        CHttpConnection* pHttpConn = NULL;
        CHttpFile* pHttpFile = NULL;
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
前面SET是设置超时值和最大连接数
后面是使用WINNET在的一般通讯函数
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

6
 
目前测试看 问题主要在SendRequest这个函数;
网络不畅或者没有网络的时候,运行到这里就卡这不动过一下就程序退出
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
Return Value
Nonzero if it is successful; otherwise, it is zero. If the call fails, determine the cause of the failure by examining the thrown CInternetException object.


又是mfc啊。
看了文档意思是如果失败会抛出一个异常,如果你没有处理这个异常(使用try...catch),那么这个异常会被一层层的往上传递,知道到达系统层,
这个时候就会造成你的程序异常退出。

1、使用try...catch在任何可能有这种问题的api上。
2、使用win32的 wininet api, 例如
InternetSetOption
InternetConnect

 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

8
 
我使用了异常 但是没有用
        CATCH(CInternetException, pException)
        {
                if(pHttpFile)
                {
                        pHttpFile->Close();
                        delete pHttpFile;
                        pHttpFile = NULL;
                }
               
                if(pHttpConn)
                {
                        pHttpConn->Close();
                        delete pHttpConn;
                        pHttpConn = NULL;
                }

                inetSession.Close();
               

                TCHAR lpszErrorMsg[MAX_PATH+2];
                pException->GetErrorMessage(lpszErrorMsg, MAX_PATH);
                CString strExp(lpszErrorMsg);
               
                pException->Delete();
        }
你所说的
2、使用win32的 wininet api, 例如
InternetSetOption ————我在上面使用了SETOPTION做了设置也没有用
InternetConnect


超时设置是没有用,看了MSDN的解释,对超时设置是没有用的。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

9
 
你设的最大超时值是多少?改过吗?
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

10
 
是不是还要处理他的异常?我这里可以获取到异常。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 8 楼 shuiyan 的回复:
你设的最大超时值是多少?改过吗?


上面的代码写了 发送值是1000 没有改过,
但是我每次断开网络的时候,如果第一次连接成功,第二次要等待2-3分钟,
如果第一次断开了网测试,再进行第二次的时候只要1S 程序就退出

 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

12
 
怎么这么喜欢用MFC,用API是最快的,对于楼主这个情况,最好的方法是在主进程中监控线程,设置个超时时间,过了就直接关闭线程,不然系统会进入死锁,不过我用线程的时候,线程死锁了也不会对主程序有什么影响,你的情况肯定和MFC的内部机制有关系了,而且很明确的告诉你,你设置的最大超时值在不正常的网络情况下根本没用,为什么你要研究TCP/IP协议了,最后你会发现,只有自己写的监控程序才是最可靠的。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

13
 
程序退出解决了 就是没有获取所有的异常,现在测试稳定了。

引用 11 楼 dthxman 的回复:
怎么这么喜欢用MFC,用API是最快的,对于楼主这个情况,最好的方法是在主进程中监控线程,设置个超时时间,过了就直接关闭线程,不然系统会进入死锁,不过我用线程的时候,线程死锁了也不会对主程序有什么影响,你的情况肯定和MFC的内部机制有关系了,而且很明确的告诉你,你设置的最大超时值在不正常的网络情况下根本没用,为什么你要研究TCP/IP协议了,最后你会发现,只有自己写的监控程序才是最可靠的。


在PDA上如何监控?比如当我发现1分钟过去了,但是还没有反应,这个时候我要关闭他 ,如何让他安全退出?
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

14
 

方法1、建立一个全局的event,
主线程:在建立线程前resetevent,然后等待waitsingleobject, 建立线程,得到线程句柄。
新线程:在线程中处理完网络业务后setevent。
主线程:如果超时,强行杀死线程,terminatethread。

方法2、
主线程:建立线程,得到线程句柄,等待线程句柄的结束。waitsingleobject。线程退出线程句柄自动set。
新线程:在线程中处理完网络业务后退出线程。
主线程:如果超时,强行杀死线程,terminatethread。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

15
 
我现在使用的是你的方法2
是等待线程退出,但是怕如果这个时间太长了,
我使用过CloseHandle(m_hThread);----会导致程序退出
terminatethread能安全退出?
MSDN解释这个也是个危险操作
TerminateThread is used to cause a thread to exit. When this occurs, the target thread has no chance to execute any user-mode code and its initial stack is not deallocated. DLLs attached to the thread are not notified that the thread is terminating.

This function reduces memory leaks by clearing the stack before exiting. It also terminates the thread process only if the thread in question is the main or primary thread.

TerminateThread is a dangerous function that should only be used in the most extreme cases. You should call TerminateThread only if you know exactly what the target thread is doing, and you control all of the code that the target thread could possibly be running at the time of the termination. For example, TerminateThread can result in the following problems:

If the target thread owns a critical section, the critical section will not be released.
If the target thread is executing certain kernel32 calls when it is terminated, the kernel32 state for the thread's process could be inconsistent.
If the target thread is manipulating the global state of a shared DLL, the state of the DLL could be destroyed, affecting other users of the DLL.

 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

16
 
呵呵,如果不让使用,微软提供它干什么呢!

它就是在没有别的方法关闭线程时使用的。

正常是在线程中加一个event,线程运行时每次检查一下event的状态。
但是现在你的线程都在一个api中死等了,只能暴力杀死它了。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

17
 
DWORD hand ;
GetExitCodeThread(m_Thead, &hand);
TerminateThread(m_Thead,hand);

实际应用起来好像没有什么事。不知道上面我代码有没有写错 Handle m_Thead
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

18
 
GetExitCodeThread是在TerminateThread后使用的。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(中级)

19
 
那TerminateThread的第二个参数怎么获取

dwExitCode
Specifies the exit code for the thread. Use the GetExitCodeThread function to retrieve a thread's exit value.
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表