您的位置:首页 > 理论基础 > 计算机网络

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

2010-11-01 11:10 323 查看
最近一直在做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)网络,从而在后续的操作中判断是否需要添加代理地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: