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网上亲测过,在3G和WLAN是否也通用暂时还不敢肯定。
第二种应用往往用在复用通道上,比方说同一个程序有多个线程(或者使用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);
但是一次当我将vUl和vDl声明成类的成员变量时,弄成如下方式
TUint32 iUl = 0;
TUint32 iDl = 0;
再将其用TPckg进行封装之后,传入DataTransferredRequest函数,得到的流量始终是0,真的让我百思不得其解,这种失误教训真的太深刻。
另外,近来发现RConnection类的实例对象是不能够进行跨线程调用,同样的CRepository的实例对象跨线程调用也是不允许的。
posted on 2009-08-12 17:37
frank.sunny 阅读(2480)
评论(0) 编辑 收藏 引用 所属分类:
symbian 开发