franksunny的个人技术空间
获得人生中的成功需要的专注与坚持不懈多过天才与机会。 ——C.W. Wendte

RConnection 的基类是RSubSessionBase。目前我所知道的就是两个功能:一、为套接字在SymbianOS上使用建立会话通道,二、使用已建立的会话通道

第一种应用是为了屏蔽接入点(IAP)选择对话框,具体代码如下

TInt currentProfileId;

 

// Check whether we are offline or online

iRepository->Get(KProEngActiveProfile, currentProfileId);

if (currentProfileId == 5)

{

    // Close and uninitialize

    iConnection.Close();

    iSocketServ.Close();

}

//这里的iSelectedIap是已经选择好的接入点iap

if(iSelectedIap == 0)

       return;

 

User::LeaveIfError(iSocketServ.Connect());

User::LeaveIfError(iConnection.Open(iSocketServ));

TCommDbConnPref pref;

// IAP ID for connection to be used

pref.SetIapId(iSelectedIap);

//CEikonEnv::Static()->InfoWinL(_L("note:"), _L("Iap OK"));

pref.SetDialogPreference( ECommDbDialogPrefDoNotPrompt);

pref.SetDirection(ECommDbConnectionDirectionOutgoing );

//CEikonEnv::Static()->InfoWinL(_L("note:"), _L("Pref Ok"));

iConnection.Start(pref,iStatus);

SetActive();

由以上代码可知,建立会话通道是一个异步函数,所以最好在活动对象中使用,因为目前该代码只是在G网上亲测过,在3GWLAN是否也通用暂时还不敢肯定。

 

第二种应用往往用在复用通道上,比方说同一个程序有多个线程(或者使用C/S架构的程序,不同的进程乃至两个完全无关的)需要使用网络,没必要每个线程都去建立一个会话通道,所以就采用复用的方式;还有一种复用的要求就是用RConnection来获得当前链接的流量等数据,以下就给出这么一种应用的代码:

TUint      vUl = 0;

TUint      vDl = 0;

TPckg< TUint >  UplinkVolume(vUl);

TPckg< TUint >  DownlinkVolume(vDl);

TRequestStatus  aStatus;

RConnection          vConnection;

if(vConnection.Open(iSocketServ) == KErrNone)

{

       TPckgBuf<TConnectionInfo> connInfo;

       TUint count;

       if (vConnection.EnumerateConnections(count) == KErrNone)

       {

              for (TUint i=1; i<=count; i++)

              {

                     // Note: GetConnectionInfo expects 1-based index.

                     if (vConnection.GetConnectionInfo(i, connInfo) == KErrNone)

                     {    

                            TInt vErr = vConnection.Attach(connInfo, RConnection::EAttachTypeNormal);

 

                     }

              }

       }

}

 

vConnection.DataTransferredRequest(UplinkVolume, DownlinkVolume, aStatus);

User::WaitForRequest(aStatus);

 

TFileName vBuffergg,vBuffergg2;

vBuffergg.AppendNum(vDl);

iObserver.RComValuesL(EGetConnectId,_L("KDownlinkData"),vBuffergg,0); 

vBuffergg2.AppendNum(vUl);

iObserver.RComValuesL(EGetConnectId,_L("KUplinkData"),vBuffergg2,0);    

 

vConnection.Close();

 

代码往往都是很简单的,但是往往会有点问题,在这个获取流量的方法上,起初我们使用单线程可以用,但是后来居然不能用了,百思不得其解,后来经过分析存在后面的一些问题,先得出一个结论,RConnection可以跨线程乃至进程使用

 

注意点

TConnectionInfoV2获取的coninfo不能进行attach,否则会爆-34错误,如果同一个RConnection对象已经连接上了,再继续使用attach,则会报-14错误,但是RConnection对象仍然是可以正常使用的,可以通过它创建Socket和监控流量等。

在使用TPckg的时候尤其要注意类型的配对问题,因为上面代码中用到的是局部变量,很显然如下代码不会有误

TUint      vUl = 0;

TUint      vDl = 0;

TPckg< TUint >  UplinkVolume(vUl);

TPckg< TUint >  DownlinkVolume(vDl);

但是一次当我将vUlvDl声明成类的成员变量时,弄成如下方式

TUint32   iUl = 0;

TUint32   iDl = 0;

再将其用TPckg进行封装之后,传入DataTransferredRequest函数,得到的流量始终是0,真的让我百思不得其解,这种失误教训真的太深刻。


    另外,近来发现RConnection类的实例对象是不能够进行跨线程调用,同样的CRepository的实例对象跨线程调用也是不允许的。

posted on 2009-08-12 17:37 frank.sunny 阅读(2480) 评论(0)  编辑 收藏 引用 所属分类: symbian 开发

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理



常用链接

留言簿(13)

随笔分类

个人其它博客

基础知识链接

最新评论

阅读排行榜

评论排行榜