<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > GPRS開(kāi)發(fā)系列文章之進(jìn)階篇

GPRS開(kāi)發(fā)系列文章之進(jìn)階篇

作者: 時(shí)間:2016-10-08 來(lái)源:網(wǎng)絡(luò ) 收藏

HRESULT WINAPI ConnMgrReleaseConnection( HANDLE hConnection,BOOL bCache );

【連接管理API大致使用步驟】:

首先我們利用ConnMgrApiReadyEvent()函數來(lái)確認是否有可用連接,如果有可用連接我們則利用ConnMgrEnumDestinations()函數枚舉所有可用連接,然后遍歷所有連接調用我們的同步或異步連接方法ConnMgrEstablishConnectionSync()與ConnMgrEstablishConnection()來(lái)發(fā)起連接,一旦連接成功后我們就可以進(jìn)行我們偉大的下一步了,就是和我們的服務(wù)器進(jìn)行通信。

【GPRS demo效果圖】

【GPRSDemo介紹】

GPRSDemo主要利用了上述的幾個(gè)重要的API函數來(lái)獲取當前可用連接,并自動(dòng)選擇一個(gè)最佳的連接途徑,然后啟用這個(gè)連接,在連接啟動(dòng)成功以后再用socket 進(jìn)行網(wǎng)絡(luò )連接,與公網(wǎng)服務(wù)器進(jìn)行通信。

首先檢查是否有可用連接

BOOL CConnectManager::GetConnMgrAvailable()

{

HANDLE hConnMgr = ConnMgrApiReadyEvent ();

BOOL bAvailbale = FALSE;

DWORD dwResult = ::WaitForSingleObject ( hConnMgr, 2000 );

if ( dwResult == WAIT_OBJECT_0 )

{

bAvailbale = TRUE;

}

// 關(guān)閉

if ( hConnMgr ) CloseHandle ( hConnMgr );

return bAvailbale;

}

然后枚舉所有可用連接:

void CConnectManager::EnumNetIdentifier ( OUT CStringArray StrAry )

{

CONNMGR_DESTINATION_INFO networkDestInfo = {0};

// 得到網(wǎng)絡(luò )列表

for ( DWORD dwEnumIndex=0; ; dwEnumIndex++ )

{

memset ( networkDestInfo, 0, sizeof(CONNMGR_DESTINATION_INFO) );

if ( ConnMgrEnumDestinations ( dwEnumIndex, networkDestInfo ) == E_FAIL )

{

break;

}

StrAry.Add ( networkDestInfo.szDescription );

}

}

接下來(lái)找到“Internet”這個(gè)連接,可用遠程URL映射的方式來(lái)完成,這樣可以讓系統自動(dòng)選取一個(gè)最好的連接。

int CConnectManager::MapURLAndGUID ( LPCTSTR lpszURL, OUT GUID guidNetworkObject, OUT CString *pcsDesc/*=NULL*/ )

{

if ( !lpszURL || lstrlen(lpszURL) 1 )

return FALSE;

memset ( guidNetworkObject, 0, sizeof(GUID) );

int nIndex = 0;

HRESULT hResult = ConnMgrMapURL ( lpszURL, guidNetworkObject, (DWORD*)nIndex );

if ( FAILED(hResult) )

{

nIndex = -1;

DWORD dwLastError = GetLastError ();

AfxMessageBox ( _T(Could not map a request to a network identifier) );

}

else

{

if ( pcsDesc )

{

CONNMGR_DESTINATION_INFO DestInfo = {0};

if ( SUCCEEDED(ConnMgrEnumDestinations(nIndex, DestInfo)) )

{

*pcsDesc = DestInfo.szDescription;

}

}

}

return nIndex;

}

最后啟用指定編號的連接并檢查連接狀態(tài)

BOOL CConnectManager::EstablishConnection ( DWORD dwIndex )

{

// 釋放之前的連接

ReleaseConnection ();

// 得到正確的連接信息

CONNMGR_DESTINATION_INFO DestInfo = {0};

HRESULT hResult = ConnMgrEnumDestinations(dwIndex, DestInfo);

BOOL bRet = FALSE;

if(SUCCEEDED(hResult))

{

// 初始化連接結構

CONNMGR_CONNECTIONINFO ConnInfo;

ZeroMemory(ConnInfo, sizeof(ConnInfo));

ConnInfo.cbSize = sizeof(ConnInfo);

ConnInfo.dwParams = CONNMGR_PARAM_GUIDDESTNET;

ConnInfo.dwFlags = CONNMGR_FLAG_PROXY_HTTP | CONNMGR_FLAG_PROXY_WAP | CONNMGR_FLAG_PROXY_SOCKS4 | CONNMGR_FLAG_PROXY_SOCKS5;

ConnInfo.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE;

ConnInfo.guidDestNet = DestInfo.guid;

ConnInfo.bExclusive = FALSE;

ConnInfo.bDisabled = FALSE;

DWORD dwStatus = 0;

hResult = ConnMgrEstablishConnectionSync(ConnInfo, m_hConnection, 10*1000, dwStatus );

if(FAILED(hResult))

{

m_hConnection = NULL;

}

else bRet = TRUE;

}

return bRet;

}

檢測連接狀態(tài)

BOOL CConnectManager::WaitForConnected ( int nTimeoutSec, DWORD *pdwStatus/*=NULL*/ )

{

DWORD dwStartTime = GetTickCount ();

BOOL bRet = FALSE;

while ( GetTickCount ()-dwStartTime (DWORD)nTimeoutSec * 1000 )

{

if ( m_hConnection )

{

DWORD dwStatus = 0;

HRESULT hr = ConnMgrConnectionStatus ( m_hConnection, dwStatus );

if ( pdwStatus ) *pdwStatus = dwStatus;

if ( SUCCEEDED(hr) )

{

if ( dwStatus == CONNMGR_STATUS_CONNECTED )

{

bRet = TRUE;

break;

}

}

}

Sleep ( 100 );

}

return bRet;

}

最后要記得釋放連接

void CConnectManager::ReleaseConnection ()

{

if ( m_hConnection )

{

ConnMgrReleaseConnection(m_hConnection, FALSE);

m_hConnection = NULL;

}

}

2. 客戶(hù)端與服務(wù)器端進(jìn)行socket通信APIsocket通信相關(guān)開(kāi)發(fā)API在Winsock2.h.文件中定義,因為SOCKET通信不是本文的重點(diǎn)但是又是必須要涉及的



關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>