使用RHTTPTransaction后产生CONE 36 Panic的解决办法

本文探讨了在仅使用RHTTPSession和RHTTPTransaction进行HTTP操作时出现CONE36 panic的问题,并提供了两种解决方案:一是手动管理连接的生命周期;二是从会话中检索并关闭连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当应用程序只使用RHTTPSession和RHTTPTransaction来进行HTTP操作,那么在模拟器上的程序退出后会产生CONE 36的panic,通过SDK可以找到对应的说明“Open handles were found during application shutdown”也就是说程序在退出时还有系统资源没有释放(R类),那么产生问题原因是什么呢?

分析程序的整个流程可以发现:应用程序首先通过RHTTPTransaction::SubmitL()提交第一次请求后系统会弹出接入点选择的对话框,在我们选择一个接入点后系统开始我们的应用建立网络的初始连接,其实这个过程就是通过RConnection::Start()来完成的,连接建立成功后把它和应用程序进行关联,而我们的程序在退出时并没有显示地通过RConnection::Close()来关闭连接,这就造成了资源没被释放从而产生了CONE 36这个panic。解决办法有两个:一、我们的程序自己通过RConnection创建连接,然后在程序退出时会关闭它:

class CHTTPEngine :     public CBase, 
                                          public MHTTPTransactionCallback,
                                          public MHTTPDataSupplier,
                                          public MHTTPAuthenticationCallback
{
.......................
private:
.......................
RSocketServ        iSocketServ;
RConnection        iConnection;
RHTTPSession            iSession;
RHTTPTransaction      iTransaction;
}

//为了方便代码演示使用了同步连接操作.
void CHTTPEngine::ConnectL()

{
      iSocketServ.Connect();
      iConnection.Open(iSocketServ);
      iConnection.Start();
      User::WaitForRequest( status );   //wait for connecting
      User::LeaveIfError( status.Int() );
      iSession.OpenL()
      RHTTPConnectionInfo connInfo = iSession.ConnectionInfo();
      RStringPool pool = iSession.StringPool();
      //为HTTP会话设置连接
      connInfo.SetPropertyL(pool.StringF(HTTP::EHttpSocketServ,RHTTPSession::GetTable()), THTTPHdrVal(iSocketServ.Handle()));
      TInt connPtr = REINTERPRET_CAST(TInt, &iConnection);
      connInfo.SetPropertyL(pool.StringF(HTTP::EHttpSocketConnection,RHTTPSession::GetTable()), THTTPHdrVal(connPtr));
}

CHTTPEngine::~CHTTPEngine()
{
      .......................
       iSession.Close();
       iConnection.Close();
       iSocketServ.Close();
       ....................
}

二、不使用额外的RSocketServ和RConnection,在退出时获取相关联的对象,然后关闭连接:
CHTTPEngine::~CHTTPEngine()
{
       RHTTPConnectionInfo connInfo = iSession.ConnectionInfo();
       RStringPool pool = iSession.StringPool();
       //为HTTP会话设置连接的反向操作
       THTTPHdrVal val;
       TBool ret = connInfo.Property(pool.StringF(HTTP::EHttpSocketServ,RHTTPSession::GetTable()), val  );
       RSocketServ socketServ;
       RConnection *connection = NULL;
       if( ret )
       {
              socketServ.SetHandle( val.Int() );
              ret = connInfo.Property(pool.StringF(HTTP::EHttpSocketConnection,RHTTPSession::GetTable()), val );
              if( ret )
              {
                     connection = REINTERPRET_CAST(RConnection*, val.Int());
              }
              if( connection )
              {
                     connection->Close();
              }
              socketServ.Close();
       }
       iSession.Close();
....................
}

第一种方法自己建立连接,通常使用异步机制,增加了程序的复杂度,但是可以通过RConnection::Start()的另一个版本Start(TConnPref& aPref, TRequestStatus& aStatus)实现隐藏接入点选择对话框,自己设置接入点。第二种方法不用添加额外的操作,适合不关心接入点的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值