2705|3

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

超难的网络问题!!!!!!在线请教!!!! [复制链接]

运行平台:ARM4;
运行系统:wince5.0
开发工具:EVC4.0(sp4)

做一个在平台上运行的客户端程序,可以有线上网下载东西。
在EVC上采用了CInternetSession, CHttpConnection, CHttpFile类去实现。
代码:
        DWORD dwFlags = 0;
        InternetGetConnectedState( &dwFlags, 0 );
        CInternetSession session( NULL, 1,
                 ( dwFlags & INTERNET_CONNECTION_PROXY ) == INTERNET_CONNECTION_PROXY ?INTERNET_OPEN_TYPE_PRECONFIG :INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, NULL, NULL, 0);

        AfxParseURL( m_strDownloadUrl, dwFlags, m_strServer, m_strObject, m_nPort );

        try {
                if ( dwFlags== AFX_INET_SERVICE_HTTP ) {
                        m_pFile = NULL;
                        CString strRangeQuest;
                        if ( m_bSupportResume )  
                        {
                                strRangeQuest.Format( _T("%sRange: bytes=%d-%d\r\n"), szHeaders, m_state.range[2*index], m_state.range[2 * index + 1] );
                       
                        }
                        else
                        {
                                strRangeQuest = szHeaders;
                        }
                       
                        try {     
                                m_pFile = (CHttpFile*) session.OpenURL( m_strDownloadUrl, 1, INTERNET_FLAG_TRANSFER_BINARY, strRangeQuest, -1 );   
                        }   
                        catch (CInternetException* e)   
                        {        
                                TCHAR   szCause[MAX_PATH] = {0};   
                                e->GetErrorMessage(szCause, MAX_PATH);  
                                AfxMessageBox( szCause );
                                e->Delete();
                                delete m_pFile;  
                                m_pFile = NULL;
                                session.Close();
                                return -1;  
                        }

                        if ( m_pFile != NULL ) {  
                                CFile file;
                                CString name;   
                                name.Format( _T("%d"), index );   
                                name = m_strTempSavePath + name;   
                                int bOpen = 0;
                                if(!m_bResume)   
                                        bOpen = file.Open(name, CFile::modeCreate | CFile::modeWrite);   
                                else   
                                        bOpen = file.Open(name, CFile::modeWrite);
                                if(bOpen == 0){   
                                        TRACE(_T("Error in file open!\n"));
                                        m_pFile->Close();
                                        session.Close();
                                        return -10;   
                                }   
                                file.SeekToEnd();
                               
                                BYTE buffer[BUFFER_SIZE+1] = {0};        
                                try {            
                                        UINT nRead = 0;  
                                        m_dwDownloadSize[index] = 0;
                                        do {  
                                                if ( m_bTerminate[index] ) {
                                                        m_state.range[2 * index] += m_dwDownloadSize[index];  
                                                        m_pFile->Close();
                                                        session.Close();
                                                        file.Close();
                                                        return -5;   
                                                }

                                                try {
                                                        nRead = m_pFile->Read( buffer, BUFFER_SIZE );   
                                                }
                                                catch( CInternetException *pe)
                                                {
                                                        TCHAR szCause[MAX_PATH] = {0};
                                                        pe->GetErrorMessage(szCause, MAX_PATH);
                                                        AfxMessageBox( szCause );      
                                                        pe->Delete();
                                                        m_state.range[2 * index] += m_dwDownloadSize[index];
                                                        m_pFile->Close();  
                                                        session.Close();
                                                        file.Close();           
                                                        return -5;
                                                }
                                               
                                                if ( nRead > 0)  {
                                                        buffer[nRead] = 0;
                                                        file.Write( buffer, nRead );
                                                        m_dwDownloadSize[index] += nRead;
                                                }            
                                        } while ( nRead > 0 );      
                                }      
                                catch (CFileException *e)        
                                {            
                                        TCHAR szCause[MAX_PATH] = {0};
                                        e->GetErrorMessage(szCause, MAX_PATH);
                                        AfxMessageBox( szCause );   
                                        e->Delete();
                                        m_state.range[2 * index] += m_dwDownloadSize[index];
                                        m_pFile->Close();
                                        session.Close();
                                        file.Close();           
                                        return -5;        
                                }
     
                                m_pFile->Close();      
                                file.Close();
                        }
                        else {
                                session.Close();
                                return -1;
                        }
                } else {            
                        AfxMessageBox( _T("only support HTTP file download!") );
                        session.Close();
                        return -1;  
                }        
        }  
        catch ( CException* pEx ) {
                TCHAR szErrorMsg[MAX_PATH] = {0};        
                pEx->GetErrorMessage(szErrorMsg, MAX_PATH);        
                AfxMessageBox( szErrorMsg );      
                pEx->Delete();
                if ( m_pFile )
                        m_pFile->Close();
                session.Close();
                return -1;
        }
       
        session.Close();
        return 0;

   这段代码在PC上运行时可以对网络突然断开的问题进行处理,因为系统会把CInternetException类异常抛给try-catch ( CInternetException* pEx )语句处理。但是这段代码在平台上运行,网络突然断开时,系统没有把CInternetException类异常抛给try-catch语句处理,系统似乎认为程序没有语句在catch这个异常。
开始我认为是EVC编译器的问题,去查了资料,微软有出RTTI.exe补丁对有类型的try-catch进行支持,按照微软的步骤做了,但是try-catch语句还是不
能捕获到异常,或者说系统没有把异常抛出给应用程序自己处理。
   请问大家在wince5.0上用wininet做网络编程对这些网络异常问题是怎样处理的,似乎只能去catch CInternetException异常,函数一般在异常情况下都不返回。
谢谢。
   

最新回复

LZ说的很好,在使用winsock编程的时候,我也曾用过internettimeout,正常使用时没有问题,但在测试的时候模拟了各种可能出现的网络状况 ,如自己的IP不对造成的连接错误,或者连接的服务器关闭出现的错误,用internettimeout都不能很好的捕捉,当时我也没有去查什么BUG,直接换算法,也就是开个监控线程,网络的状况况太复杂,相信一个函数太不可靠了,由于使用C,关于捕捉异常一直没用过TRY,学习,,,,  详情 回复 发表于 2007-12-4 11:09
点赞 关注

回复
举报

78

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
建议修改一下实现方法,DownloadDlg_src.zip(到baidu上搜一下吧),这个源码我已经移植到CE下了,效果还不错,其中有一些容错的处理.
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
问题我已经解决。

原因之一:微软的internettimeout机制有问题,是其官方承认了的bug,需自己建立线程去check网络是否超时,一旦超时就close当前连接,异常就会捕获到;
原因之二:在EVC中的异常捕获是宏定义,应该用
           TRY
          {
          }
          CATCH( CException, pEx )
          {
          }
          END_CATCH_ALL  

资源共享,才能使我们迅速的解决一些知之为知之,不知为不知的问题,希望大家能多把自己遇到的问题和解决的方法都贴出来帮助他人~~~
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

4
 
LZ说的很好,在使用winsock编程的时候,我也曾用过internettimeout,正常使用时没有问题,但在测试的时候模拟了各种可能出现的网络状况 ,如自己的IP不对造成的连接错误,或者连接的服务器关闭出现的错误,用internettimeout都不能很好的捕捉,当时我也没有去查什么BUG,直接换算法,也就是开个监控线程,网络的状况况太复杂,相信一个函数太不可靠了,由于使用C,关于捕捉异常一直没用过TRY,学习,,,,
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表