新聞中心

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

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

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

        HRESULT WINAPI ConnMgrReleaseConnection( HANDLE hConnection,BOOL bCache );

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

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

        【GPRS demo效果圖】

        【GPRSDemo介紹】

        GPRSDemo主要利用了上述的幾個(gè)重要的API函數(shù)來獲取當(dāng)前可用連接,并自動(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 );

        }

        }

        接下來找到“Internet”這個(gè)連接,可用遠(yuǎn)程URL映射的方式來完成,這樣可以讓系統(tǒng)自動(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;

        }

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

        BOOL CConnectManager::EstablishConnection ( DWORD dwIndex )

        {

        // 釋放之前的連接

        ReleaseConnection ();

        // 得到正確的連接信息

        CONNMGR_DESTINATION_INFO DestInfo = {0};

        HRESULT hResult = ConnMgrEnumDestinations(dwIndex, DestInfo);

        BOOL bRet = FALSE;

        if(SUCCEEDED(hResult))

        {

        // 初始化連接結(jié)構(gòu)

        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;

        }

        檢測(cè)連接狀態(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. 客戶端與服務(wù)器端進(jìn)行socket通信APIsocket通信相關(guān)開發(fā)API在Winsock2.h.文件中定義,因?yàn)镾OCKET通信不是本文的重點(diǎn)但是又是必須要涉及的



        關(guān)鍵詞:

        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 怀远县| 洞头县| 永新县| 青川县| 龙口市| 离岛区| 安庆市| 桂东县| 广宁县| 施甸县| 郑州市| 襄樊市| 尼木县| 黎平县| 鄄城县| 新余市| 长海县| 临江市| 遵化市| 常州市| 伽师县| 江安县| 来安县| 灵丘县| 来宾市| 陈巴尔虎旗| 三穗县| 章丘市| 寻甸| 双鸭山市| 修水县| 沅江市| 禄丰县| 金平| 马鞍山市| 奉化市| 安吉县| 闽清县| 龙南县| 抚顺市| 高邑县|