新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > GPRS開發系列文章之進階篇

        GPRS開發系列文章之進階篇

        作者: 時間:2016-10-08 來源:網絡 收藏

        HRESULT WINAPI ConnMgrReleaseConnection( HANDLE hConnection,BOOL bCache );

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

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

        【GPRS demo效果圖】

        【GPRSDemo介紹】

        GPRSDemo主要利用了上述的幾個重要的API函數來獲取當前可用連接,并自動選擇一個最佳的連接途徑,然后啟用這個連接,在連接啟動成功以后再用socket 進行網絡連接,與公網服務器進行通信。

        首先檢查是否有可用連接

        BOOL CConnectManager::GetConnMgrAvailable()

        {

        HANDLE hConnMgr = ConnMgrApiReadyEvent ();

        BOOL bAvailbale = FALSE;

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

        if ( dwResult == WAIT_OBJECT_0 )

        {

        bAvailbale = TRUE;

        }

        // 關閉

        if ( hConnMgr ) CloseHandle ( hConnMgr );

        return bAvailbale;

        }

        然后枚舉所有可用連接:

        void CConnectManager::EnumNetIdentifier ( OUT CStringArray StrAry )

        {

        CONNMGR_DESTINATION_INFO networkDestInfo = {0};

        // 得到網絡列表

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

        {

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

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

        {

        break;

        }

        StrAry.Add ( networkDestInfo.szDescription );

        }

        }

        接下來找到“Internet”這個連接,可用遠程URL映射的方式來完成,這樣可以讓系統自動選取一個最好的連接。

        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;

        }

        最后啟用指定編號的連接并檢查連接狀態

        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;

        }

        檢測連接狀態

        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. 客戶端與服務器端進行socket通信APIsocket通信相關開發API在Winsock2.h.文件中定義,因為SOCKET通信不是本文的重點但是又是必須要涉及的



        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 龙陵县| 英德市| 广河县| 五原县| 福海县| 青河县| 安阳市| 徐汇区| 耒阳市| 曲麻莱县| 临朐县| 砚山县| 保山市| 托克逊县| 长子县| 龙江县| 高邮市| 松原市| 东乌珠穆沁旗| 三都| 沙河市| 宣化县| 平塘县| 石门县| 奉贤区| 教育| 陕西省| 郯城县| 五台县| 皋兰县| 神农架林区| 巩义市| 灵丘县| 桃江县| 临西县| 土默特左旗| 昂仁县| 娱乐| 灌云县| 宣恩县| 阜康市|