本文主要是介绍RConnection的简单使用两则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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的实例对象跨线程调用也是不允许的。
这篇关于RConnection的简单使用两则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!