蓝色恋枫

愿风指引你的到来。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

  最近做的一个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 ;

   }
    }
以上代码的意思是,我会遍历全部连接设置然后一个个进行连接,只要有一个连接成功就退出,知道全部不成功也推出。

这样,我就基本能保证正常情况下网络一直能够通畅。

还有一个比较值得一提的是,当手机来电或者通话的时候,系统会将网络自动断开,等通话结束,再自动恢复网络,这时候,我们不能进行连网,否则造成问题,所以需要加上一个限制,如果当前在通话,而网络断开,则不进行连接,至于如何得知当前是否有通话,这里就不说了,只是提醒大家要注意到这个问题。

 

 

posted on 2009-11-12 14:29  蓝色恋枫  阅读(731)  评论(0)    收藏  举报