最近做的一个wm手机上的客户端,要求一个连接网路的功能,咋一看挺简单的要求,但是我也是经过了一点波折才做的有些完善。
首先要连网,我们需要知道连什么样的网,手机的连网方式一般有以下几种,1,通过Cellular 方式,就是最常用的 GPRS。2,通过NIC ,即网卡,大多是wifi。3,通过PC机连网,这个通过activeSync连上就行。还有一些比较偏的就不说了,这三种我想是大多 WM手机的上网方式了。GPRS又分两种,wap和net,其实就是一个经过代理连接网络,一个直接连上网络,在设置网络连接的时候才会有分别,这里就不说了。
好了,那么下面开始说我是怎么样做这个连接的。
1,首先,我打开了一条新的线程,在线程中,我监听当前手机的网络连接状况,要用到 ConnMgrQueryDetailedStatus 这个函数,它会返回当前所有连接的状况。下面是代码。
DWORD dwSize = 0;
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)
{
if( cmStatus->dwConnectionStatus == CONNMGR_STATUS_CONNECTED &&
(CM_CONNTYPE_CELLULAR == cmStatus->dwType||
CM_CONNTYPE_NIC == cmStatus->dwType ||
CM_CONNTYPE_PC == cmStatus->dwType ))
{
delete []pBuffer;
return hr;
}
cmStatus = cmStatus->pNext;
}
}
delete []pBuffer;
return E_FAIL;
2,这样我在线程里没10秒获取一次网络状态,当我发现没有任何连接连接在网络的时候,我就要获得网络设置然后进行连接,这里又要用到另外两个函数 ConnMgrEnumDestinations和ConnMgrEstablishConnectionSync,代码如下,
CONNMGR_DESTINATION_INFO networkDestInfo = {0};
//
for ( DWORD dwEnumIndex=0; ; dwEnumIndex++ )
{
memset ( &networkDestInfo, 0, sizeof(CONNMGR_DESTINATION_INFO) );
if ( ConnMgrEnumDestinations ( dwEnumIndex, &networkDestInfo ) == E_FAIL )
{
return FALSE;
}
CONNMGR_CONNECTIONINFO ConnInfo;
ZeroMemory(&ConnInfo, sizeof(ConnInfo));
ConnInfo.cbSize = sizeof(ConnInfo);
ConnInfo.dwParams = CONNMGR_PARAM_GUIDDESTNET;
// TODO: need to test if and a flag CONNMGR_FLAG_SUSPEND_AWARE
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 = networkDestInfo.guid;
// TODO: if want to connect ad shared.
ConnInfo.bExclusive = FALSE;
ConnInfo.bDisabled = FALSE;
ConnInfo.hWnd =hwnd;
ConnInfo.uMsg = WM_CONNECTION_NOTIFY;
DWORD dwStatus;
HRESULT rel = ConnMgrEstablishConnectionSync( &ConnInfo,&m_hConnection,10000,&dwStatus );
if( rel == S_OK )
{
return TRUE;
}
else
{
continue ;
}
}
以上代码的意思是,我会遍历全部连接设置然后一个个进行连接,只要有一个连接成功就退出,知道全部不成功也推出。
这样,我就基本能保证正常情况下网络一直能够通畅。
还有一个比较值得一提的是,当手机来电或者通话的时候,系统会将网络自动断开,等通话结束,再自动恢复网络,这时候,我们不能进行连网,否则造成问题,所以需要加上一个限制,如果当前在通话,而网络断开,则不进行连接,至于如何得知当前是否有通话,这里就不说了,只是提醒大家要注意到这个问题。
浙公网安备 33010602011771号