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)网络,从而在后续的操作中判断是否需要添加代理地址。
由于拨号采用的是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)网络,从而在后续的操作中判断是否需要添加代理地址。
相关文章推荐
- 如何判断一段程序是由C编译程序还是由C++编译程序编译的
- 原创:如何黑箱判断黑莓Java程序走的是什么网络通道?DirectTCP, WAP, WAP2, BES, BIS
- Android之如何判断GitHub上下载的程序代码是用Android studio写的还是用eclipse写的
- 如何从程序中判断待编译的文件是.c还是.cpp?
- 如何判断一段程序是由C 编译程序还是由C++编译程序编译的?
- 如何写程序判断自己电脑是大端字节序还是小端字节序?
- 如何判断一段程序是由C编译程序还是由C++编译程序编译的
- 如何选择APP开发,还是小程序开发,各自的特点你需要了解全
- 如何判断一段程序是由C 编译程序还是由C++编译程序编译的?
- 如何使用程序判断系统是大端还是小端?
- 如何判断程序是x86还是x64类型
- 如何在程序中判断硬件的机型(是ipad还是iphone/ipod touch)
- 如何判断是linux/windows库,module或程序debug还是release
- 如何判断,程序安装时,用户选择的盘符?
- 关于如何判断程序和类库是Debug 还是 Release 的问题
- qt4:如何判断用户在关闭窗口是选择的是ok还是cancle
- 如何判断一个程序是C编译的还是C++编译的
- 如何判断java程序是从class启动还是从jar启动的?
- Android如何判断程序是在前台还是在后台运行
- 如何判断一段程序是由C 编译程序还是由C++编译程序编译的