c# wincd gprs

 但透过ConnMgrMapURL、ConnMgrEstablishConnectionSync、ConnMgrQueryDetailedStatus这三个函数的组合是可以达到楼主想要的结果。步骤如下:
1、先用ConnMgrMapURL让系统来选择一个最佳的连接,其实系统选择的就是我们在网络管理中所设置的。
  GUID guid;
    memset(&guid, 0, sizeof(GUID));
    DWORD dwIndex = 0;
   ::ConnMgrMapURL(L"http://wap.baidu.com", &guid, &dwIndex);
这边的url是用http开头还是wsp开题我没研究过,但值得注意的是dwIndex一定要初始化为0。

2、然后用ConnMgrEstablishConnectionSync建立连接
           CONNMGR_CONNECTIONINFO connInfo;
        ZeroMemory(&connInfo, sizeof(CONNMGR_CONNECTIONINFO));
        //为了能够建立连接要填写CONNMGR_CONNECTIONINFO结构体
        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 = guid;//这边的GUID用的就是刚才ConnMgrMapURL所得到的GUID
        connInfo.bExclusive        = FALSE;
        connInfo.bDisabled = FALSE;        
        //通过同步方式建立连接
        hResult = ::ConnMgrEstablishConnectionSync(&connInfo, &m_hConnection, 10*1000, &dwStatus);

3、通过以上两个步骤其实已经建立的GPRS连接,但并非就这样完事了,就如同网上经常有人讨论的那样这边不可避免的还得牵扯CMWAP和CMNET的问题(简单点就是是否使用代理),但获取代理之前得先找到当前建立的连接,这个可以通过ConnMgrQueryDetailedStatus来实现。
        DWORD dwSize = 0;
        GUID destGuid;
        char m_sNowTraffic[255];
        HRESULT hr = E_FAIL;
        hr = ConnMgrQueryDetailedStatus(NULL, &dwSize);
        if(STRSAFE_E_INSUFFICIENT_BUFFER != hr)
                return hr;

        LPBYTE pBuffer = new BYTE[dwSize];
        if(NULL == pBuffer)
                return E_OUTOFMEMORY;

        hr = ConnMgrQueryDetailedStatus((CONNMGR_CONNECTION_DETAILED_STATUS*)pBuffer, &dwSize);
        if(S_OK == hr)
        {
                CONNMGR_CONNECTION_DETAILED_STATUS* cmStatus  = (CONNMGR_CONNECTION_DETAILED_STATUS*)pBuffer;
                while(NULL != cmStatus)
                {
                        // 找到当前处于连接状态的GPRS连接
                 if((cmStatus->dwParams &
                         (CONNMGRDETAILEDSTATUS_PARAM_TYPE |CONNMGRDETAILEDSTATUS_PARAM_DESCRIPTION | CONNMGRDETAILEDSTATUS_PARAM_CONNSTATUS))
                                &&CM_CONNTYPE_CELLULAR == cmStatus->dwType &&CONNMGR_STATUS_CONNECTED == cmStatus->dwConnectionStatus &&NULL != cmStatus->szDescription)        
                        {
                                //我不知道这个destGuid的学名叫什么,但是它在寻找代理的过程中很有用处                           
                                  memcpy(&destGuid, &(cmStatus->guidDestNet), sizeof(GUID));

                        }
                        cmStatus = cmStatus->pNext;
                }
        }
        // clear the buffer
        delete pBuffer;
4、接着就是通过查找注册表来得到代理了,当然如果是CMNET的话就没有代理了,因而通过以下函数也就不会有什么结果
bool GetProxyFromReg(TCHAR * szProxy, int nProxySize)
{
                HKEY hKey;
        //打开注册表
        if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, SEARCH_KEY, 0 ,0, &hKey))
        {
                return false;
        }
        DWORD dwSubKeysNumber;
        DWORD dwMaxSubKeyLen;
        if (ERROR_SUCCESS != RegQueryInfoKey(hKey, NULL, NULL, NULL, &dwSubKeysNumber, &dwMaxSubKeyLen, NULL, NULL, NULL, NULL, NULL, NULL) )
        {
                return false;
        }
        
        int nIndex = 0;
        DWORD dwSize;
        DWORD dwType;
        DWORD dwNSize = MAX_PATH;
        TCHAR szSubKeyName[MAX_PATH] = {0};
        TCHAR szDestId[MAX_PATH] = {0};

        CString strSrcGuid;
        //这边的m_guid就是步骤3中所得到的那个destGuid
        strSrcGuid.Format(_T("{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}"),
                                     m_guid.Data1, m_guid.Data2, m_guid.Data3,
                                     m_guid.Data4[0], m_guid.Data4[1],  m_guid.Data4[2],
                                     m_guid.Data4[3], m_guid.Data4[4],m_guid.Data4[5],
                                     m_guid.Data4[6], m_guid.Data4[7]);

        bool bSearch = false;
        while (!bSearch && ERROR_NO_MORE_ITEMS != RegEnumKeyEx(hKey, nIndex, szSubKeyName, &dwNSize, NULL, NULL, NULL, NULL))
        {
                HKEY hSubKey;
                CString strSubPath = SEARCH_KEY + CString(_T("//")) + CString(szSubKeyName);
                DWORD dwNetType = -1;
                DWORD dwEnable = -1;
                TCHAR szSrcId[MAX_PATH] = {0};

                if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, strSubPath, 0, 0, &hSubKey) == ERROR_SUCCESS)
                {
                        dwSize = sizeof(szSrcId);
                        RegQueryValueEx(hSubKey, _T("SrcId"), NULL, &dwType, (LPBYTE)szSrcId, &dwSize);
                                
                        dwSize = sizeof(dwNetType);
                        RegQueryValueEx(hSubKey, _T("Type"), NULL, &dwType, (LPBYTE)&dwNetType, &dwSize);
                        
                        dwSize = sizeof(dwEnable);
                        RegQueryValueEx(hSubKey, _T("Enable"), NULL, &dwType, (LPBYTE)&dwEnable, &dwSize);
                        if (strSrcGuid.CompareNoCase(szSrcId) == 0 && (dwNetType == CONNMGR_FLAG_PROXY_HTTP) && dwEnable == 1)
                        {
                               //就在这边了,只是得到是类似于10.0.0.172:80的东西                           
                                dwSize = nProxySize;
                                RegQueryValueEx(hSubKey, _T("Proxy"), NULL, &dwType, (LPBYTE)szProxy, &dwSize);
                                bSearch = true;
   
                       }
                        RegCloseKey(hSubKey);
                }        
                nIndex++;
                dwNSize = MAX_PATH;
        }
         RegCloseKey(hKey);
         if( bSearch && szProxy[0] == NULL )
                 return FALSE;
         return bSearch;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值