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 閱讀(2488)
評論(0) 編輯 收藏 引用 所屬分類:
symbian 開發