mobile下如何判断出程序选择的是wap还是net网络

最近一直在做mobile联网方面的工作,有点成果,在此分享下。希望大家能够指正。

 

由于拨号采用的是ConnMgrMapURL来自动分析选择连接方式,所以对于如何区分wap和net网络是个比较头疼的问题。参考了刀哥的文章

http://blog.csdn.net/pknife/archive/2008/11/07/3248315.aspx

 

和下面帖子里

http://topic.csdn.net/u/20080520/16/ff4273af-c2f3-409b-b992-4c18bd48d91a.html

 

网友chengchenz的回帖,总结出下面方法:

 

电信(CDMA)

 

HRESULT GetAPNFromEntryName(LPCTSTR szEntryName, TCHAR* szAPN)
{
 LPCWSTR szFormat =    TEXT("<wap-provisioningdoc>")
  TEXT("    <characteristic type=/"CM_PPPEntries/">")
  TEXT("        <characteristic type=/"%s/">")
  TEXT("                <parm-query name=/"UserName/"/>")
  TEXT("        </characteristic>")
  TEXT("    </characteristic>")
  TEXT("</wap-provisioningdoc>");

 

 HRESULT hr = E_FAIL;
 LPWSTR szOutput   = NULL;

 

 if(NULL == szEntryName)
  return E_INVALIDARG;

 

 int nLen = _tcslen(szFormat) + _tcslen(szEntryName) + 10;


 LPWSTR szInput = new TCHAR[nLen];
 ZeroMemory(szInput, nLen);


 if(NULL == hr)
  return E_OUTOFMEMORY;

 

 _stprintf(szInput, szFormat, szEntryName);

 

 hr = DMProcessConfigXML(szInput, CFGFLAG_PROCESS, &szOutput);


 if(S_OK == hr)
 {
  hr = E_FAIL;
  LPWSTR szAPNStrStart = _tcsstr(szOutput, TEXT("value=/""));


  if(NULL != szAPNStrStart)
  {
    szAPNStrStart += _tcslen(TEXT("value=/""));

 

    LPWSTR szAPNStrEnd = _tcsstr(szAPNStrStart, TEXT("@")); //CDMA


   if(NULL != szAPNStrEnd)
   {
     int nResult = szAPNStrEnd - szAPNStrStart;
     for (int i = 0; i < nResult; ++i)
     {
      szAPN[i] = szAPNStrStart[i];
     }

     _tcscpy(m_szAPNResult, szAPN);

 

     hr = S_OK;
   }
  }
 }

 

 delete[] szOutput;
 delete[] szInput;
 return hr;
}

 

 

移动(GSM)

 

 

HRESULT GetAPNFromEntryName(LPCTSTR szEntryName, TCHAR* szAPN)
{
 LPCWSTR szFormat =    TEXT("<wap-provisioningdoc>")
  TEXT("    <characteristic type=/"CM_GPRSEntries/">")
  TEXT("        <characteristic type=/"%s/">")
  TEXT("            <characteristic type=/"DevSpecificCellular/">")
  TEXT("                <parm-query name=/"GPRSInfoAccessPointName/"/>")
  TEXT("            </characteristic>")
  TEXT("        </characteristic>")
  TEXT("    </characteristic>")
  TEXT("</wap-provisioningdoc>");

 

 HRESULT hr = E_FAIL;
 LPWSTR szOutput   = NULL;

 

 if(NULL == szEntryName)
  return E_INVALIDARG;

 

 int nLen = _tcslen(szFormat) + _tcslen(szEntryName) + 10;
 LPWSTR szInput = new TCHAR[nLen];
 ZeroMemory(szInput, nLen);


 if(NULL == hr)
  return E_OUTOFMEMORY;

 

 

 _stprintf(szInput, szFormat, szEntryName);

 

 hr = DMProcessConfigXML(szInput, CFGFLAG_PROCESS, &szOutput);


 if(S_OK == hr)
 {
  hr = E_FAIL;
  LPWSTR szAPNStrStart = _tcsstr(szOutput, TEXT("value=/""));


  if(NULL != szAPNStrStart)
  {
   szAPNStrStart += _tcslen(TEXT("value=/""));

 

   LPWSTR szAPNStrEnd = _tcsstr(szAPNStrStart, TEXT("/"")); //GSM


   if(NULL != szAPNStrEnd)
   {
    int nResult = szAPNStrEnd - szAPNStrStart;
    for (int i = 0; i < nResult; ++i)
    {
     szAPN[i] = szAPNStrStart[i];
    }

    _tcscpy(m_szAPNResult, szAPN);

 

    hr = S_OK;


   }
  }
 }

 

 

 delete[] szOutput;
 delete[] szInput;
 return hr;
}

 

 

下面是测试函数:

 

void fun()
{
 DWORD dwSize = 0;
 HRESULT hr = E_FAIL;

 

 // Get the the required size of the buffer
 // with which the function needs to be called on the next attempt.


 hr = ConnMgrQueryDetailedStatus(NULL, &dwSize);


 if(STRSAFE_E_INSUFFICIENT_BUFFER != hr)
  return;

 

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

 

 TCHAR szAPN[MAX_PATH];
 ZeroMemory(szAPN, MAX_PATH);

 

 // Get the connection information


 hr = ConnMgrQueryDetailedStatus((CONNMGR_CONNECTION_DETAILED_STATUS*)pBuffer, &dwSize);


 CONNMGR_CONNECTION_DETAILED_STATUS* cmStatus  = (CONNMGR_CONNECTION_DETAILED_STATUS*)pBuffer;

 

 if(S_OK == hr)
 {
  // Enum each connection entry
  while(NULL != cmStatus)
  {
   // find the connected GPRS entry


   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)       
   {
    GetAPNFromEntryName(cmStatus->szDescription, szAPN);

   }


   // test the next one
   cmStatus = cmStatus->pNext;
  }

 }

 

 delete pBuffer;
}

 

这样,可以正确的区分出cmwap和cmnet(ctwap和ctnet)网络,从而在后续的操作中判断是否需要添加代理地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值